Как сделать копию объекта ArrayList типа List? - PullRequest
7 голосов
/ 05 августа 2010

Я изучал Java, передавая ссылку на объект по значению, и чтобы сделать локальную копию объекта, я могу сделать clone () или конструктор копирования.Я также рассмотрел глубокую / мелкую копию, а также несколько постов по stackoverflow.

Теперь я смотрю на пример:

List<String> list = new ArrayList<String>();
String one = "one"
list.add(one);

В нескольких прочитанных статьях упоминается, что ArrayList реализует клонируемый, но делаетна самом деле не говорят, как сделать локальную копию «списка», если типом является List, а не ArrayList, который не реализует cloneable.

Я могу вызвать clone (), если «list» является типом ArrayList.

ArrayList<String> list = new ArrayList<String();
list.clone();

Но если type - List, я не могу.

Должен ли я просто использовать конструктор копирования, как показано ниже, для локального копирования?Как лучше всего сделать копию «списка»?

List<String> tmpList = new ArrayList<String>(list);

Ответы [ 3 ]

5 голосов
/ 05 августа 2010

Передача списка в конструктор, вероятно, лучший путь.Сам вызов конструктора будет использовать за кулисами System.arraycopy.Таким образом, он будет эффективно отделять локальную копию от списка, переданного через конструктор.

0 голосов
/ 10 апреля 2015

Кажется сомнительным, что вы хотите сделать вашу коллекцию неизмененной, чтобы вы могли использовать Collections.unmodifiableList().

0 голосов
/ 05 августа 2010

Используйте конструктор копирования всякий раз, когда можете. clone() устарел и не должен использоваться (и не реализовываться) в новом коде.

Если вы расширяете класс, который реализует Cloneable, у вас мало выбора, кроме как реализовать корректный clone метод. В противном случае, вам лучше предоставить альтернативные средства копирование объекта или просто отсутствие возможности. [...] Хороший подход к копированию объекта заключается в предоставлении конструктора копирования или фабрики копирования . [...]

Учитывая все проблемы, связанные с Cloneable, можно с уверенностью сказать, что другие интерфейсы не должны расширять его, и что классы предназначены для наследования (Пункт 17) не должен реализовывать это. Из-за многих недостатков некоторые опытные программисты просто выбирают никогда не переопределять метод clone и никогда вызывать его, за исключением, возможно, копирования массивов.

С Effective Java 2nd Edition , позиция 11.

...