Java: Как сделать копию массива объекта? - PullRequest
11 голосов
/ 20 ноября 2011

Сейчас у меня есть массив объектов Point, и я хочу сделать COPY из этого массива.

Я пробовал следующие способы:

1)Point[] temp = mypointarray;

2) Point[] temp = (Point[]) mypointarray.clone();

3)

Point[] temp = new Point[mypointarray.length];
System.arraycopy(mypointarray, 0, temp, 0, mypointarray.length);

Но все эти способы заключаются в том, что для temp создается только ссылка на mypointarray, а не копия.

Например, когда я изменил координату x mypointarray [0] на 1 (исходное значение равно 0), координата x для temp [0] тоже изменилась на 1 (Iклянусь, я не трогал temp).

Так есть ли способы сделать копию массива Point?

Спасибо

Ответы [ 3 ]

17 голосов
/ 20 ноября 2011

Вам нужно сделать глубокую копию. Для этого нет встроенной утилиты, но это достаточно просто. Если Point имеет конструктор копирования, вы можете сделать это следующим образом:

Point[] temp = new Point[mypointarray.length];
for (int i = temp.length - 1; i >= 0; --i) {
    Point p = mypointarray[i];
    if (p != null) {
        temp[i] = new Point(p);
    }
}

Это допускает нулевые элементы массива.

С Java 8 вы можете сделать это более компактно с помощью потоков:

Point[] temp = Arrays.stream(mypointarray)
                     .map(point -> point == null ? null : new Point(point))
                     .toArray(Point[]::new);

И если вам гарантировано, что ни один элемент mypointarray не равен null, он может быть еще более компактным, поскольку вы можете исключить тест null и использовать Point::new вместо написания своей собственной лямбды для map():

Point[] temp = Arrays.stream(mypointarray).map(Point::new).toArray(Point[]::new);
0 голосов
/ 20 ноября 2011

Вы можете использовать служебный класс Arrays:

import java.util.Arrays;
...
Point[] copy = Arrays.<Point>copyOf(mypointarray, mypointarray.length);
0 голосов
/ 20 ноября 2011

вам придется создавать копии всех экземпляров Point самостоятельно ...

, пока ваш класс Point сериализуем, вы можете сериализовать + десериализовать этот массив, чтобы получить быструю глубокую копию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...