You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 16:03:15