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.

image

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.

3. Source Files

4. References