- 此问题在此处已有答案**:
Assigning Array to new variable, changing original changes the new one(4个答案)
Problem with assigning an array to other array in Java(4个答案)
How can an integer array be a reference type?(2个答案)
3天前关闭.
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));
}
}
输出是15,2,3,4,但是为什么?我从来没有改变"arr"。
3条答案
按热度按时间8fq7wneg1#
在Java中,数组是对象,而不是原语类型。当你把link to
arr
赋给新变量时,y
仍然指向arr
,所以你实际上是在改变arr
。就是这样。但是如果你想复制数组,你可以使用这个方法:Arrays.copyOf(int[] original, int newLength)
uklbhaso2#
假设你有一个儿子,名叫Jackson。你把他介绍给你的朋友,“嘿,朋友,见见我的儿子Jackson”。朋友说,“嗨,Jackson,我叫你杰克。”后来,朋友打电话给他说,“嘿,杰克,来拿一把糖果”。你的儿子Jackson来找你,然后你看到他有一把糖果。但是怎么会呢?你从来没有给过Jackson糖果。但是你的朋友给了杰克。有道理吗?
在你的代码中,arr和y是完全相同的实体,不是相等的,不是复制的,而是完全相同的对象,所以你在一个地方做了改变,它也会在另一个地方显示出来。
nnsrf1az3#
当您初始化整数数组arr时,在您执行以下代码时,它会在堆中为引用变量arr分配一个空间:
这个arr是指堆中的整数数组,因为数组在java中是对象。
现在,当您执行以下代码时:
这就创建了一个引用变量y,它引用了堆中与引用变量arr引用的对象相同的对象,这就是为什么无论你通过引用变量y或引用变量arr做什么改变,都会反映堆中创建的对象的改变,因为它们引用了相同的对象。
如果你想给你的引用变量y分配一个新的对象,它类似于arr数组的元素,那么你可以克隆它,下面的代码表示它:
这将给出一个输出:
因此,您的arr数组这次不受影响。