2015-04-01 2 views
-1

У меня есть массив объектов с переопределенным методом clone(). Когда я использую arraycopy() func, он будет копировать каждый элемент через метод clone() или он делает мелкую копию? ThanksИспользует ли System.arraycopy метод clone()?

+4

Это будет просто скопировать ссылки на объекты, не сами объекты. – isnot2bad

ответ

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:

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); 
3

System.arraycopy производит мелкую копию указанной части массива.

+0

Итак, цикл 'for' - единственный способ для глубокой копии? –

+0

, предоставляя конструктор копирования для типа элемента массива, вы можете, например, использовать 'java.util.Arrays.stream (objs) .map (T :: new) .toArray (T [] :: new)' для создания массив глубоких копий – muued

Смежные вопросы