Метод clone
Метод clone создает и возвращает новую коллекцию,
которая является поверхностной копией исходного списка
ArrayList. Копия содержит те же элементы в том же
порядке, что и оригинал, но является независимым объектом.
Метод не принимает параметров и возвращает результат типа
Object, поэтому при необходимости его нужно явно
приводить к типу ArrayList.
Важно понимать, что копирование является поверхностным: создается новый список, но сами элементы не копируются. Если элементы являются изменяемыми объектами, то изменения внутри этих объектов будут видны как в оригинале, так и в копии.
Синтаксис
ArrayList<Integer> copy = (ArrayList<Integer>) list.clone();
Пример
Давайте создадим список и получим его поверхностную копию:
import java.util.ArrayList;
public class Main
{
public static void main(String[] args)
{
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
ArrayList<Integer> res = (ArrayList<Integer>) list.clone();
System.out.println(res);
}
}
Результат выполнения кода:
[1, 2, 3]
Пример
Давайте убедимся, что копия является независимым списком, и изменение оригинала не затрагивает копию:
import java.util.ArrayList;
public class Main
{
public static void main(String[] args)
{
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
ArrayList<String> res = (ArrayList<String>) list.clone();
list.add("d");
list.remove("a");
System.out.println("original: " + list);
System.out.println("copy: " + res);
}
}
Результат выполнения кода:
original: [b, c, d]
copy: [a, b, c]
Пример
Давайте покажем, что копирование является поверхностным: если элементы списка - изменяемые объекты, изменения внутри них будут видны в обоих списках:
import java.util.ArrayList;
public class Main
{
public static void main(String[] args)
{
ArrayList<StringBuilder> list = new ArrayList<>();
list.add(new StringBuilder("a"));
list.add(new StringBuilder("b"));
ArrayList<StringBuilder> res = (ArrayList<StringBuilder>) list.clone();
list.get(0).append("!");
System.out.println(list);
System.out.println(res);
}
}
Результат выполнения кода:
[a!, b]
[a!, b]