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

Java对象内数组异常行为:修改对象数组意外影响外部数组

Java中修改对象内数组导致外部数组同步变化的原因及解决方法

问题原因

这是因为Java里数组属于引用类型,和int、boolean这类基本类型完全不同:

  • 当你创建int arr1[] = {1,2,3,...}时,arr1变量存储的是堆内存中数组对象的引用(内存地址),而非数组元素本身。
  • 构造方法里的this.array1 = arr;只是把arr的引用直接赋值给了对象的array1变量,相当于让ta.array1和arr1指向堆内存里同一个数组对象。
  • 不管通过哪个引用修改数组元素,本质都是在操作同一块内存里的数组,自然会同步变化。

解决方法

要让对象内的数组和外部数组相互独立,需要在构造方法里创建全新的数组对象,并把原数组的元素复制进去,而不是直接赋值引用:

修改后的构造方法代码:

public testArrays(int[] arr) {
    // 新建一个和原数组长度一致的空数组
    this.array1 = new int[arr.length];
    // 将原数组的所有元素复制到新数组中
    System.arraycopy(arr, 0, this.array1, 0, arr.length);
    
    // 也可以用更简洁的工具方法(需要导入java.util.Arrays)
    // this.array1 = Arrays.copyOf(arr, arr.length);
}

修改后运行结果

执行修改后的代码,输出会和你的预期完全一致:

arr1 Before  = [1, 2, 3, 4, 5, 6, 7]
ta.array1 Before  = [1, 2, 3, 4, 5, 6, 7]
arr1 After  = [1, 2, 3, 4, 5, 6, 7]
ta.array1 After  = [1, 2, 333, 4, 5, 6, 7]

内容的提问来源于stack exchange,提问作者naven

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 12:55:17