
java 中所有数组都是对象,方法接收的是数组引用的副本,因此对数组元素的修改会反映到原数组上,这与基本类型值传递有本质区别。
java 中所有数组都是对象,方法接收的是数组引用的副本,因此对数组元素的修改会反映到原数组上,这与基本类型值传递有本质区别。
在 Java 中,“方法参数按值传递”(pass-by-value)是铁律,但这一原则常被初学者误解为“无法修改实参”。关键在于:传递的“值”,可能是基本类型的数值,也可能是引用类型的地址值。
数组(无论 int[]、String[] 还是 Object[])在 Java 中始终是引用类型——即它是一个指向堆内存中连续对象的引用。当你将数组作为参数传入 Arrays.sort() 时,实际传递的是该引用的一个副本(即存储数组地址的变量的拷贝),而非数组本身或其元素的副本。这个副本仍指向同一块堆内存,因此方法内部通过该引用来读写数组元素(如交换位置、重排顺序),自然会影响原始数组。
✅ 正确示例:Arrays.sort() 修改原数组
import java.util.Arrays;
public class ArraySortDemo {
public static void main(String[] args) {
int[] arr = {3, 1, 4, 1, 5};
System.out.println("排序前: " + Arrays.toString(arr)); // [3, 1, 4, 1, 5]
Arrays.sort(arr); // 传入 arr 引用的副本,但指向同一数组对象
System.out.println("排序后: " + Arrays.toString(arr)); // [1, 1, 3, 4, 5]
}
}❌ 对比反例:基本类型参数无法修改原变量
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
立即学习“Java免费学习笔记(深入)”;
static void swap(int a, int b) {
int temp = a;
a = b;
b = temp; // 仅修改了形参 a/b 的局部副本,不影响调用处的变量
}
public static void main(String[] args) {
int x = 10, y = 20;
swap(x, y);
System.out.println("x=" + x + ", y=" + y); // x=10, y=20 —— 未交换!
}⚠️ 注意事项:
-
Arrays.sort()不改变数组引用本身(即不会让arr指向新数组),只修改其内部元素; - 若想避免副作用,需显式创建副本:
int[] copy = arr.clone();或int[] copy = Arrays.copyOf(arr, arr.length);; - 这一机制同样适用于
ArrayList、自定义对象等所有引用类型——只要方法内通过引用修改了对象状态(非重新赋值引用),原对象就会变化。
总结:Java 没有“传引用”,只有“传引用的值”。数组可被排序修改,不是因为它是特例,而是因为它本质是对象;理解“引用类型变量存储的是地址值”,是解开所有类似困惑的核心钥匙。

















