Java中的copyOf Arrays方法是否执行深度复制?

Java中的copyOf Arrays方法是否执行深度复制?,java,arrays,Java,Arrays,我想知道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

我想知道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]);
  }
}
似乎如果
copyOf
仅传递了引用,则生成的数组中的两个元素都应该是对具有
x=1
y=1
的点对象的引用。但是,我认为如果复制的数组被赋予对象的新副本,那么equals操作符应该返回false,因为引用应该不同。有人能帮我理解这里发生了什么吗?提前谢谢

Arrays.copyOf(T[]original,int newLength)方法使用新长度创建新数组。但将值复制到新数组。因此它是浅层复制。如果存储对象类型,则它们将是相同的

源代码

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        @SuppressWarnings("unchecked")
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

public static T[]copyOf(U[]original,int newLength,Class)“如果copyOf只传递引用,那么生成的数组应该同时包含对x=1和y=1的点对象的引用。”为什么?你没有修改
array2
…我不清楚你的逻辑。这两个数组的状态将包含相同的值。这意味着只复制引用。这可能回答了你的问题。不,它不执行深度复制。它复制引用。然后你在
array1
中修改这些引用。我明白了。是吗e将变量(如x)分配给另一个变量(如y)的任何编程语言都不会将y的值分配给x,而是对y的引用?您也可以在每个数组项上使用
System.identityHashCode()
,查看它们引用的对象是否相同。
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
        @SuppressWarnings("unchecked")
        T[] copy = ((Object)newType == (Object)Object[].class)
            ? (T[]) new Object[newLength]
            : (T[]) Array.newInstance(newType.getComponentType(), newLength);
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }