2464. Java Advanced - Shallow Copy vs Deep Copy
Shallow Copy and Deep Copy
Compare the difference between shallow copy and deep copy.
1. Shallow Copy and Deep Copy
Shallow copy
is creating a new object and then copying the non static fields of the current object to the new object. If the field is a value type, a bit by bit copy of the field is performed. If the field is a reference type, the reference is copied but the referred object is not copied, therefore the original object and its clone refer to the same object. A shallow copy of an object is a new object whose instance variables are identical to the old object.
Deep copy
is creating a new object and then copying the non-static fields of the current object to the new object. If a field is a value type, a bit by bit copy of the field is performed. If a field is a reference type, a new copy of the referred object is performed. A deep copy of an object is a new object with entirely new instance variables, it does not share objects with the old.
2. Example
2.1 Person Class
class Person { private String name; public Person(String n) { this.name = n; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return this.name; } }
2.2 Shallow Copy
private static void shallowCopy() { System.out.println("Shallow copy example:"); Person p1 = new Person("Johnny"); Person p2 = new Person("Sean"); List<Person> pList = new ArrayList<>(); pList.add(p1); pList.add(p2); //convert ArrayList to Array using shallow copy Person[] pArray = pList.toArray(new Person[0]); System.out.println("Original List = " + pList); System.out.println("Array from ArrayList = " + Arrays.toString(pArray)); //let's change the list and array pList.get(0).setName("David"); pArray[1].setName("Peter"); System.out.println("Modified List = " + pList); System.out.println("Modified Array = " + Arrays.toString(pArray)); }
2.3 Deep Copy
private static void deepCopy() { System.out.println("Deep copy example:"); Person p1 = new Person("Johnny"); Person p2 = new Person("Sean"); List<Person> pList = new ArrayList<>(); pList.add(p1); pList.add(p2); //convert ArrayList to Array using deep copy Person[] pArray = new Person[pList.size()]; for (int i = 0; i < pList.size(); i++) { Person p = pList.get(i); Person temp = new Person(p.getName()); pArray[i] = temp; } System.out.println("Original List = " + pList); System.out.println("Array from ArrayList = " + Arrays.toString(pArray)); //let's change the list and array pList.get(0).setName("David"); pArray[1].setName("Peter"); System.out.println("Modified List = " + pList); System.out.println("Modified Array = " + Arrays.toString(pArray)); }
2.4 Test
public static void main(String[] args) { shallowCopy(); System.out.println(); deepCopy(); }
Output.
Shallow copy example:
Original List = [Johnny, Sean]
Array from ArrayList = [Johnny, Sean]
Modified List = [David, Peter]
Modified Array = [David, Peter]
Deep copy example:
Original List = [Johnny, Sean]
Array from ArrayList = [Johnny, Sean]
Modified List = [David, Sean]
Modified Array = [Johnny, Peter]
- In shallow copy, both the array and the list are changed by each other.
- In deep copy, the change to array or list doesn’t impact the other.