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
相关产品推荐
相关产品推荐

