为何如下Java代码输出为[15,2,3,4]?未修改arr却改变结果
为什么修改数组y会影响原数组arr?
示例代码
public class Alle { public static void main(String[] args) { int[] arr = {1,2,3,4}; int [] y = arr; y[0] = 15; System.out.println(Arrays.toString(arr)); } }
原因解析
核心在于Java中的数组属于引用类型,和基本数据类型的赋值逻辑完全不同:
- 执行
int[] arr = {1,2,3,4};时,JVM会在堆内存中创建一个实际存储元素的数组对象,变量arr只是在栈内存中保存了这个堆数组的内存地址(也就是引用)。 - 当执行
int [] y = arr;时,并没有复制堆里的数组本身,只是把arr持有的内存地址拷贝给了y。此时arr和y是两个指向同一个堆数组对象的引用变量。 - 所以通过
y[0] = 15;修改元素时,本质是修改了堆中那个唯一的数组对象,arr作为指向同一对象的引用,输出自然会显示修改后的结果。
解决方法
如果想让修改y不影响arr,需要创建原数组的拷贝,比如使用Arrays.copyOf方法:
int[] y = Arrays.copyOf(arr, arr.length);
这样y会指向一个新的堆数组对象,两者修改互不影响。
内容的提问来源于stack exchange,提问作者Vithushan Thiru
相关产品推荐
相关产品推荐

