Java值传递机制下,为何Array.sort()能修改原数组?
Java值传递:为啥
Arrays.sort()能修改原数组,自定义swap方法却不行? 首先明确核心:Java里所有方法参数都是值传递,困惑的根源是没分清「基本类型的值」和「引用类型的值」在传递时的差异。
1. 自定义swap(int a, int b)为啥无效?
当你传递int这类基本类型变量时,方法收到的是变量数值的副本。比如调用swap(x, y),相当于把x的数值复制一份给参数a,y的数值复制一份给参数b。
在swap方法里交换a和b,只是修改了这两个副本的值,和原始的x、y没有任何关联,方法执行完后,x和y还是原来的数值。
示例代码:
public static void swap(int a, int b) { int temp = a; a = b; b = temp; } public static void main(String[] args) { int x = 1, y = 2; swap(x, y); System.out.println(x + "," + y); // 输出依然是1,2 }
2. Arrays.sort()为啥能修改原数组?
数组属于引用类型,数组变量存储的是指向堆内存中数组对象的「引用」(可以理解为对象的内存地址)。
当调用Arrays.sort(arr)时,传递的是这个引用的副本——也就是把arr里存的地址复制了一份给方法参数。但这个副本指向的堆内存数组对象,和原始arr指向的是同一个对象。
Arrays.sort()方法通过这个引用副本,直接操作了堆里的数组对象本身,修改了数组元素的顺序。方法结束后,原始arr变量依然指向那个被修改过的数组对象,所以你会看到原数组发生了变化。
示例代码:
import java.util.Arrays; public static void main(String[] args) { int[] arr = {3,1,2}; Arrays.sort(arr); System.out.println(Arrays.toString(arr)); // 输出[1,2,3] }
补充:引用类型也不是万能的
如果想让方法修改引用变量本身(比如让它指向新的对象),同样做不到,因为传递的是引用的副本。比如:
public static void changeArray(int[] arr) { arr = new int[]{4,5,6}; // 修改的是引用副本,指向新数组 } public static void main(String[] args) { int[] arr = {1,2,3}; changeArray(arr); System.out.println(Arrays.toString(arr)); // 还是输出[1,2,3] }
这里方法里给arr副本赋值了新数组,但原始arr变量依然指向原来的数组,所以看不到变化。
内容的提问来源于stack exchange,提问作者Tiger
相关产品推荐
相关产品推荐

