Мелкое копирование означает, что оно не применяется к копированию объектов внутри исходных объектов. То есть, если у вас есть объект, содержащий коллекцию, и вы клонируете этот объект, сама коллекция не копируется и может использоваться несколькими экземплярами:
public class Test implements Cloneable {
private List<String> innerList = new ArrayList<>();
public void addBaz(String baz) {
innerList.add(baz);
}
public List<String> getInnerList() {
return innerList;
}
public void setInnerList(List<String> innerList) {
this.innerList = innerList;
}
public static void main(String[] args) throws CloneNotSupportedException {
Test bar1 = new Test();
bar1.addBaz("baz1");
bar1.addBaz("baz2");
bar1.addBaz("baz3");
System.out.println("bar1 before cloning: " + bar1.getInnerList());
Test cloneBar = (Test) bar1.clone();
System.out.println("clone: " + cloneBar.getInnerList());
bar1.addBaz("baz4");
System.out.println("clone after adding to original: " + cloneBar.getInnerList());
cloneBar.addBaz("cloneBaz1");
System.out.println("bar1 after adding to clone: " + bar1.getInnerList());
}
}
Результат:
bar1 before cloning: [baz1, baz2, baz3]
clone: [baz1, baz2, baz3]
clone after adding to original: [baz1, baz2, baz3, baz4]
bar1 after adding to clone: [baz1, baz2, baz3, baz4, cloneBaz1]
1006 *
Результат:
map before cloning: {a1=->a1, a2=->a2, a3=->a3}
clone: {a1=->a1, a2=->a2, a3=->a3}
clone after adding to original: {a1=->a1, a2=->a2, a3=->a3}
original after adding to clone: {a1=->a1, a2=->a2, a3=->a3, b1=->b1}
clone after modifying object inside original: {a1=->new a1, a2=->a2, a3=->a3, c1=->c1}
original after modifying the clone: {a1=->new a1, a2=->cloned a2, a3=->a3, b1=->b1}