修改在Java中作为参数传递的数组

时间:2014-11-11 00:38:19

标签: java methods encapsulation

为什么这样做有效,按排序顺序显示array?:

Integer[] array={7,5,9,3,6,0,2,4};

MergeSort.mergeSort(array,0,7);

System.out.println(Arrays.toString(array));

具体来说,为什么将array传递给公共静态void方法mergeSort最终会修改数组本身?我认为Java受此保护。例如这段代码:

  public static void main(String[] args){
    int c=2;
    change(c);
    System.out.print(c);
  }
  public static void change(int c){
    c=4;
  }

返回2而不是4.我很困惑为什么Java允许你修改作为参数传递的数组,而不是int

2 个答案:

答案 0 :(得分:3)

因为Java是按值传递的,当您传递Object(并且数组是Object)时,您将引用的值传递给Object。相比之下,基元没有引用,因此您只需传递该值。

修改

同样,您可以使用内置的Arrays.sort()方法对数组进行排序。 Java数组不是原始类型。在Java中,原始包装类型是不可变的(如String)。考虑,

private static void change(String in) {
    in = in + " World"; // <-- modifies in here, can't change caller's reference.
}

private static void change(StringBuilder in) {
    in.append(" World"); // <-- uses reference from caller.
}

public static void main(String[] args) {
    String str = "Hello";
    StringBuilder sb = new StringBuilder(str);
    change(str);
    change(sb);
    System.out.println("one: " + str);
    System.out.println("two: " + sb);
}

答案 1 :(得分:0)

使用数组时,不管是否作为参数,请考虑arr[i]是指向内存某个位置的指针。然后,当接收数组作为参数时,您有一个指向同一数组对象的新引用。这意味着在您的方法中,说明如下:

myParameterArray = new int[5];

不会修改输入数组,因为您只是更改引用的值,而不是它指向的值。尽管如此,说明如下:

myParameterArray[i] = 5;

将直接修改您的输入数组。这就是像Arrays.sort这样的方法。