【问题标题】:Does System.arraycopy use clone() method?System.arraycopy 是否使用 clone() 方法?
【发布时间】:2015-06-06 18:48:15
【问题描述】:

我有一个对象数组,其中包含一个重写的 clone() 方法。当我使用arraycopy() func 时,它会通过clone() 方法复制每个元素还是进行浅拷贝? 谢谢

【问题讨论】:

  • 它只会复制对对象的引用,而不是对象本身。

标签: java deep-copy shallow-copy arrays


【解决方案1】:

System.arraycopy(...)Arrays.copyOf(...) 都只是创建原始数组的(浅)副本;他们不会自己复制或克隆包含的对象:

// given: three Person objects, fred, tom and susan
Person[] people = new Person[] { fred, tom, susan };
Person[] copy = Arrays.copyOf(people, people.length);
// true: people[i] == copy[i] for i = 0..2

如果您真的想复制对象本身,则必须手动执行此操作。如果对象是 Cloneable,则应该使用简单的 for 循环:

Person[] copy = new Person[people.length];
for(int i = 0; i < people.length; ++i) copy[i] = people[i].clone();

自 Java 8 以来提供了另一种可能更优雅的解决方案:

Person[] copy = Arrays.stream(people).map(Person::clone).toArray(Person[]::new);

【讨论】:

    【解决方案2】:

    System.arraycopy 生成指定数组部分的浅表副本。

    【讨论】:

    • 那么for 循环是深拷贝的唯一方法?
    • 通过为数组的元素类型提供一个复制构造函数,您可以例如使用java.util.Arrays.stream(objs).map(T::new).toArray(T[]::new) 创建一个深拷贝数组
    猜你喜欢
    • 2011-11-03
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 2015-05-12
    • 1970-01-01
    • 2011-11-26
    相关资源
    最近更新 更多