Это действительно мелкая копия, вот комментарий для клона из исходного кода ArrayList
Возвращает поверхностную копию этого экземпляра ArrayList.(Сами элементы не копируются.)
Чтобы понять это, давайте посмотрим на фрагмент в методе клонирования из ArrayList
v.elementData = Arrays.copyOf(elementData, size);
Как мы знаем, когда мы назначаем объектв переменную JAVA не делает совершенно новую копию этого объекта.Вместо этого эта переменная становится другой ссылкой, указывающей на исходный объект.
Таким образом, elementData фактически хранит ссылку на объекты, помещенные в этот ArrayList.И клонировать просто скопировать эти ссылки, реплики объектов не создаются.
Конечно, вы можете удалить или добавить новую ссылку на клонированный ArrayList.
Однако, модификация старых объектов в одном ArrayListбудет влиять на оригинальный ArrayList.С вашим примером сложно сделать иллюстрацию, поскольку Integer неизменен.
Чтобы увидеть побочный эффект, вы можете определить пользовательский изменяемый объект
class Person {
private int a;
public void setA(int a) {
this.a = a;
}
public int getA() {
return a;
}
@Override
public String toString() {
return String.valueOf(a);
}
}
Затем вы можете использовать следующий код для проверки
Person p1 = new Person();
Person p2 = new Person();
ArrayList<Person> tt = new ArrayList<Person>();
tt.add(p1);
tt.add(p2);
ArrayList<Person> yy = (ArrayList<Person>) tt.clone();
Person vv = yy.get(yy.indexOf(p2));
vv.setA(12);
yy.remove(p1);
System.out.println("tt: " + tt);
System.out.println("yy: " +yy);
Вывод долженбыть
tt: [0, 12]
гг: [12]
Смотрите побочный эффект :)?Мы изменяем только элемент в yy, но это также отражается в tt.