为什么这样做有效,按排序顺序显示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
答案 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
这样的方法。