Monday, July 16, 2018

what do you mean by Shallow Cloning and Deep Cloning in java?

Problem statement: Shallow copy vs Deep copy.
shallow = little depth
Shallow copy [meaning reference copy]
is method of copying an object and is followed by default in cloning. In this method the fields of an old object X are copied to the new object Y. While copying the object type field the reference is copied to Y i.e object Y will point to same location as pointed out by X. If the field value is a primitive type it copies the value of the primitive type

Therefore, any changes made in referenced objects in object X or Y will be reflected in other object


Deep copy [meaning object copy]

If we want to create a deep copy of object X and place it in a new object Y then new copy of any referenced objects fields are created and these references are placed in object Y. This means any changes made in referenced object fields in object X or Y will be reflected only in that object and not in the other. In below example, we create a deep copy of object.

A deep copy copies all fields, and makes copies of dynamically allocated memory pointed to by the fields. A deep copy occurs when an object is copied along with the objects to which it refers.

Explanation with program:

import java.util.ArrayList;
class TestExe {
    int x, y;
}
// reference of TestExe and implements clone with deep copy
class Test2 implements Cloneable {
    int a, b;
    TestExe c = new TestExe();
    public Object clone() throws CloneNotSupportedException {
        // Assign the shallow copy to new reference variable t
        Test2 t = (Test2) super.clone();
        t.c = new TestExe();
        return t;
    }
}
public class DeepCloning {
    public static void main(String args[]) throws CloneNotSupportedException {
        Test2 t1 = new Test2();
        t1.a = 10;
        t1.b = 20;
        t1.c.x = 30;
        t1.c.y = 40;
        Test2 t2 = (Test2) t1.clone();
        t2.a = 100;
        // Change in primitive type of t2 will not be reflected in t1 field
        t2.c.x = 300;
        // Change in object type field of t2 will not be reflected in t1(deep copy)
        System.out.println(t1.a + " " + t1.b + " " + t1.c.x + " " + t1.c.y);
        System.out.println(t2.a + " " + t2.b + " " +t2.c.x + " " + t2.c.y);
    }
}
Output:
10 20 30 40
100 20 300 0

No comments:

Post a Comment

Blueprint for self-improvement

To learn faster: Make the process fun To understand yourself : Write To understand the world better : Read To build deeper connection : Lis...