【发布时间】:2017-05-19 18:53:22
【问题描述】:
我想知道 Arrays 类中的 copyOf 方法是创建新对象,然后将其传递到复制的数组上,还是只是创建引用现有对象的新变量。我曾尝试构建一些代码来测试这一点:
import java.awt.Point;
import java.util.Arrays;
public class PointTest2 {
public static void main(String[] args) {
Point[] array1 = new Point[2];
Point[] array2 = new Point[2];
for(int i = 0; i < array1.length; i++) {
array1[i] = new Point(i, i);
}
array2 = Arrays.copyOf(array1, 2);
array1[0] = array1[1];
array1[1] = array2[0];
System.out.println(Arrays.toString(array1));
System.out.println(Arrays.toString(array2));
System.out.println(array1[0] == array2[1]);
}
}
这个程序返回:
[java.awt.Point[x=1,y=1], java.awt.Point[x=0,y=0]]
[java.awt.Point[x=0,y=0], java.awt.Point[x=1,y=1]]
true
似乎如果copyOf 只传递了引用,那么结果数组应该有两个元素都是对x = 1 和y = 1 的点对象的引用。但是,我认为如果为复制的数组提供了对象的新副本,那么 equals 运算符应该返回 false,因为引用应该不同。有人可以帮我理解这里发生了什么吗?提前致谢!
【问题讨论】:
-
"如果 copyOf 只传递引用,那么结果数组应该有两个元素都是对 x = 1 和 y = 1 的点对象的引用。"为什么?你没有修改
array2...你的逻辑我不清楚。 -
java documentation 声明 两个数组将包含相同的值。 表示仅复制引用。也许这回答了你的问题Does Arrays.copyOf produce a shallow or a deep copy?
-
不,它不执行深层复制。它复制参考。然后你在
array1中修改这些引用。 -
我明白了。是否有任何编程语言将变量 x 分配给另一个变量 y 不会将 y 的值分配给 x,而是对 y 的引用?
-
您也可以在每个数组项上使用
System.identityHashCode()并查看它们是否引用了相同的对象。