System.arraycopy是否使用clone()方法?

时间:2015-04-01 23:06:52

标签: java arrays deep-copy shallow-copy arraycopy

我有一个带有重写clone()方法的对象数组。当我使用arraycopy() func时,它是否会通过clone()方法复制每个元素,还是会生成浅层副本? 感谢

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分: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);