public class TestingArray {
public static void main(String[] args) {
int iCheck = 10;
int j = iCheck;
j = 11;
System.err.println("value of iCheck "+iCheck);
int[] val1 = {1,2,9,4,5,6,7};
int[] val2 = val1;
val2[0] = 200;
System.err.println("Array Value "+val1[0]);
}
}
输出:
iCheck 10的价值 数组值200
从上面的代码中,我发现如果将任何数组val2
分配给另一个数组val1
,并且如果我们更改val2
数组的任何值,结果也会反映出来对于数组val1
,而相同的方案没有变量赋值。
为什么呢?
答案 0 :(得分:27)
以下语句使val2
引用与val1
相同的数组:
int[] val2 = val1;
如果您想制作副本,可以使用val1.clone()
或Arrays.copyOf()
:
int[] val2 = Arrays.copyOf(val1, val1.length);
对象(包括集合类的实例,String
,Integer
等)以类似的方式工作,因为将一个变量分配给另一个只是复制引用,使两个变量引用同一个对象。如果有问题的对象是可变的,那么通过其中一个变量对其内容进行的后续修改也将通过另一个变得可见。
原始类型(int
,double
等)表现不同:没有涉及引用,赋值会复制该值。
答案 1 :(得分:3)
简单地说,“val1”和“val2”是指向实际数组的指针。您指定val2指向与val1相同的数组。因此,改变一个,另一个看到相同的变化。要让它真正成为副本,您必须克隆数组而不是分配。
答案 2 :(得分:2)
因为Java中的数组是对象,即通过引用传递。
答案 3 :(得分:1)
因为您将val1
的引用分配给val2
,所以它们都指向内存中的同一个对象。