据我所知,Java是按值传递的,即当我使用原始类型时,我无法交换它们(如果我使用了Objects,那么它是可能的)。我写了一个程序来记下整数数组的所有排列。为此,我使用swap
函数作为参数数组,两个位置,并交换这些位置中的数字。我的计划工作?!有人可以解释一下为什么吗?以下是代码:
public class Solution {
public List<List<Integer>> permute(int[] num) {
if(num == null || num.length == 0)
return null;
List<List<Integer>> res = new ArrayList<List<Integer>>();
doPermute(num, 0, res);
return res;
}
public static void doPermute(int[] num, int k, List<List<Integer>> res){
if(k == num.length){
res.add(convertArrayToList(num));
return;
}
for(int i = k; i < num.length; i++){
swap(num, i, k);
doPermute(num, k+1, res);
swap(num, k, i);
}
}
public static List<Integer> convertArrayToList(int[] num){
List<Integer> res = new ArrayList<Integer>();
for(int i = 0; i < num.length; i++){
res.add(num[i]);
}
return res;
}
public static void swap(int[] num, int i, int j){
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
}
答案 0 :(得分:1)
Java是按值传递的。 Object的值是引用地址。数组(甚至是int[]
)是一个Object。所以,
public static void swap(int[] num, int i, int j){
int temp = num[i];
num[i] = num[j];
num[j] = temp;
}
数组num
可在swap
中修改。如果您查看java.lang.reflect.Array
,您会发现这些方法需要Object array
。
答案 1 :(得分:1)
这将起作用,因为您正在传递要更改的Object的引用,在您的情况下int[]
。请注意int[]
也是一个Object。如果您只是传递数组的值,然后尝试改变它,它本来没用。考虑这个
//Of little use ,the caller Object is not affected in any way
public static void swap(int i, int j){
int temp = i
i = j;
j = i;
}
swap(num[k], num[i]); //invoking of swap method,caller Object reference is not passed,just assignment of parameter value takes place
因为,您正在更改可变数组Object的引用,所以没有问题