为什么我的交换功能有效?

时间:2014-08-26 20:53:46

标签: java arrays pass-by-value primitive-types

据我所知,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;
    }
}

2 个答案:

答案 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的引用,所以没有问题