【发布时间】:2014-09-18 08:40:25
【问题描述】:
我以为我理解了 Java 中按值传递和引用的概念。但我刚刚发现我没有。
以下是递归调用的两个方法。在第一种方法中,我在递归调用中从上到下传递一个数组。当条件满足时,它打印数组然后返回。当递归调用返回时,添加到数组中的元素会随着每个级别的返回而被删除。
但如果我使用ArrayList,添加到列表中的元素是永久性的,即使在所有递归调用返回之后也是如此。
我假设在这两种情况下,我都通过引用(引用的副本)传递数组和Arraylist,并且我直接修改了数组。因此,无论我在数组中进行什么更改,它不应该在方法返回后保留吗?请提出建议,我哪里弄错了。
我没有添加print(),我猜从输出中可以看出。
static void recurse(int[] list, int num) {
if(num == 5) { // print if condition is true
print("Reached num = 5", list, num);
return;
}
list[num] = num;
recurse(list,num+1);
print("After recursive call returns ", list, num);// check elements in array
}
static void recurse(ArrayList<Integer> list, int num) {
if(num == 5) { // print if condition is true
print("Reached num = 5", list);
return;
}
list.add(num);
recurse(list,num+1);
print("After recursive call returns ", list); // check element of Arraylist
}
private static void print(String msg, ArrayList<Integer> list) {
System.out.println(msg);
System.out.println(list);
}
private static void print(String msg, int[] list, int index) {
System.out.println(msg);
for(int i = 0 ; i < index; ++i)
System.out.printf("%d ", list[i]);
System.out.println();
}
public static void main(String[] args) {
ArrayList<Integer> arr1 = new ArrayList<>();
recurse(arr1,0);
int[] arr2 = new int[12];
recurse(arr2,0);
}
第一个输出
Reached num = 5
0 1 2 3 4
After recursive call returns
0 1 2 3
After recursive call returns
0 1 2
After recursive call returns
0 1
After recursive call returns
0
After recursive call returns
第二个输出
Reached num = 5
[0, 1, 2, 3, 4]
After recursive call returns
[0, 1, 2, 3, 4]
After recursive call returns
[0, 1, 2, 3, 4]
After recursive call returns
[0, 1, 2, 3, 4]
After recursive call returns
[0, 1, 2, 3, 4]
After recursive call returns
[0, 1, 2, 3, 4]
【问题讨论】:
-
数组行为很好。这就是 Java 中按值传递的含义。看起来问题出在您的
print方法中,因为您没有打印列表的全部内容,所以您得到了这个奇怪的结果。 -
问题出在您的
print方法中。顺便说一句,您发布的输出与您发布的代码没有任何关系。 -
您将
num传递给print方法,所以这就是打印的数量。num未被递归调用更新。 -
Java 中没有“通过引用传递”的概念。
-
添加了您的打印方法的更改版本
标签: java arrays recursion pass-by-reference