
java中数组是引用类型,变量赋值仅复制引用而非创建新数组,因此对副本的修改会直接影响原始数组。
在Java中,int[]看似“基本类型数组”,实则是一个对象引用类型。这意味着声明 int[] arr = {1, 2, 3, 4}; 时,arr 并不直接存储数组元素本身,而是保存一个指向堆内存中该数组对象的引用(reference)。
当执行 int[] y = arr; 时,Java 并未创建新数组,而是将 arr 中存储的引用值(即内存地址)复制给了 y。此时 arr 和 y 指向同一块堆内存中的同一个数组对象:
int[] arr = {1, 2, 3, 4}; // arr → [1,2,3,4](堆中)
int[] y = arr; // y → 同一地址,共享同一数组
y[0] = 15; // 修改堆中第0个元素 → arr[0] 也变为15
System.out.println(Arrays.toString(arr)); // 输出: [15, 2, 3, 4]✅ 这正是输出为 [15, 2, 3, 4] 的根本原因:你从未显式修改 arr,但通过 y 修改了它所引用的同一对象。
⚠️ 注意事项:
- 此行为与 int x = 5; int y = x; y = 10;(基本类型赋值)完全不同——后者 x 不受影响,因为 int 是值传递。
- 所有数组(无论 int[]、String[] 还是自定义类数组)均遵循此引用语义。
- == 比较两个数组变量时,判断的是引用是否相同(即是否指向同一对象),而非内容是否相等。
? 若需真正独立的副本(深拷贝语义),应显式复制数组,例如:
int[] y = Arrays.copyOf(arr, arr.length); // 创建新数组,内容相同但独立 // 或 int[] y = arr.clone(); // 返回新数组对象(推荐用于一维基本类型数组) // 或(Java 8+) int[] y = Arrays.stream(arr).toArray();
此时修改 y[0] 将不再影响 arr,因为二者已指向不同内存区域。
总结:理解“数组是对象,赋值即传引用”是避免意外共享状态的关键。在需要隔离数据时,务必主动复制,而非依赖简单赋值。









