【问题标题】:Does the copyOf Arrays method in Java perform a deep copy? [duplicate]Java 中的 copyOf Arrays 方法是否执行深拷贝? [复制]
【发布时间】: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 = 1y = 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() 并查看它们是否引用了相同的对象。

标签: java arrays


【解决方案1】:

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;
    }

【讨论】:

    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 2010-11-19
    • 2018-02-26
    • 2016-09-27
    • 1970-01-01
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    相关资源
    最近更新 更多