Calling
List<String> b = new ArrayList<String>(a);
создает поверхностную копию a
в пределах b
. Все элементы будут существовать в b
в том же порядке, в котором они были в a
(при условии, что у него был порядок).
Аналогично, звоните
// note: instantiating with a.size() gives `b` enough capacity to hold everything
List<String> b = new ArrayList<String>(a.size());
Collections.copy(b, a);
также создает поверхностную копию a
в пределах b
. Если первый параметр, b
, не обладает достаточной вместимостью (не размером), чтобы содержать все элементы a
, он выдаст IndexOutOfBoundsException
. Ожидается, что Collections.copy
не потребует никаких распределений для работы, и, если таковые имеются, то выдает это исключение. Это оптимизация, требующая предварительного выделения скопированной коллекции (b
), но я, как правило, не думаю, что эта функция того стоит из-за необходимых проверок с учетом альтернатив на основе конструктора, таких как показанная выше, которые не имеют странной стороны эффекты.
Чтобы создать глубокую копию, List
через любой механизм должен обладать сложными знаниями о базовом типе. В случае String
s, которые являются неизменяемыми в Java (и .NET в этом отношении), вам даже не нужна глубокая копия. В случае MySpecialObject
вам нужно знать, как сделать его глубокую копию, а это не универсальная операция.
Примечание. Первоначально принятый ответ был самым высоким результатом для Collections.copy
в Google, и он был неверным, как указано в комментариях.