HowToDoInJava

  • Java 8
  • Regex
  • Concurrency
  • Best Practices
  • Spring Boot
  • JUnit5
  • Interview Questions
  • Dark Mode

Java Array Clone – Deep Copy vs Shallow Copy

By Lokesh Gupta | Filed Under: Java Array

Learn to create clone of an array in Java with example. Clone creates shallow copy of an array. Also learn to create array deep copy.

1. Array Clone – Shallow Copy

In Java, to create clone of array, you should use clone() method of array. It creates a shallow copy of array.

Cloning always creates shallow copy of array. Any change (in original array) will be reflected in cloned array as well.

package com.howtodoinjava.demo;

public class ArrayCloneExample 
{
	public static void main(String[] args) 
	{
		Employee[] empArr = new Employee[2];	//Original array

		empArr[0] = new Employee(100, "Lokesh", "Gupta", new Department(1, "HR"));
		empArr[1] = new Employee(200, "Pankaj", "Kumar", new Department(2, "Finance"));
		
		Employee[] clonedArray = empArray.clone();	//Shallow copied array
		
		empArray[0].setFirstName("Unknown");
		empArray[0].getDepartment().setName("Unknown");
		
		//Verify the change in original array - "CHANGED"
		System.out.println(empArray[0].getFirstName());						//Unknown
		System.out.println(empArray[0].getDepartment().getName());			//Unknown
		
		//Verify the change in cloned array - "CHANGED"
		System.out.println(clonedArray[0].getFirstName());					//Unknown
		System.out.println(clonedArray[0].getDepartment().getName());		//Unknown
	}
}

2. Array Deep Copy

If you want to create deep copy of an array in Java, then use Apache Common’s SerializationUtils.clone( array ) method.

package com.howtodoinjava.demo;

import org.apache.commons.lang3.SerializationUtils;

public class ArrayCloneExample 
{
	public static void main(String[] args) 
	{
		Employee[] empArray = new Employee[2];
		
		empArray[0] = new Employee(100, "Lokesh", "Gupta", new Department(1, "HR"));
		empArray[1] = new Employee(200, "Pankaj", "Kumar", new Department(2, "Finance"));
		
		Employee[] copiedArray = SerializationUtils.clone(empArray);	//Deep copied array
		
		empArray[0].setFirstName("Unknown");
		empArray[0].getDepartment().setName("Unknown");
		
		//Verify the change in original array - "CHANGED"
		System.out.println(empArray[0].getFirstName());						//Unknown
		System.out.println(empArray[0].getDepartment().getName());			//Unknown
		
		//Verify the change in deep copied array - "UNCHANGED"
		System.out.println(copiedArray[0].getFirstName());					//Lokesh
		System.out.println(copiedArray[0].getDepartment().getName());		//HR
	}
}

3. Complete Code

Complete code for creating shallow and deep copy of array in java.

package com.howtodoinjava.demo;

import org.apache.commons.lang3.SerializationUtils;

public class ArrayCloneExample 
{
	public static void main(String[] args) 
	{
		Employee[] empArray = new Employee[2];
		
		empArray[0] = new Employee(100, "Lokesh", "Gupta", new Department(1, "HR"));
		empArray[1] = new Employee(200, "Pankaj", "Kumar", new Department(2, "Finance"));
		
		Employee[] clonedArray = empArray.clone();						//Array clone
		
		Employee[] copiedArray = SerializationUtils.clone(empArray);	//Deep copied array
		
		empArray[0].setFirstName("Unknown");
		empArray[0].getDepartment().setName("Unknown");
		
		//Verify the change in original array - "CHANGED"
		System.out.println(empArray[0].getFirstName());						//Unknown
		System.out.println(empArray[0].getDepartment().getName());			//Unknown
		
		//Verify the change in cloned array - "CHANGED"
		System.out.println(clonedArray[0].getFirstName());					//Unknown
		System.out.println(clonedArray[0].getDepartment().getName());		//Unknown
		
		//Verify the change in deep copied array - "UNCHANGED"
		System.out.println(copiedArray[0].getFirstName());					//Lokesh
		System.out.println(copiedArray[0].getDepartment().getName());		//HR
	}
}
package com.howtodoinjava.demo;

import java.io.Serializable;

public class Employee implements Serializable {

	private static final long serialVersionUID = 1L;
	
	private Integer id;
	private String firstName;
	private String lastName;
	private Department department;

	public Employee(int id, String fName, String lName, Department department) {
		super();
		this.id = id;
		this.firstName = fName;
		this.lastName = lName;
		this.department = department;
	}

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getFirstName() {
		return firstName;
	}

	public void setFirstName(String firstName) {
		this.firstName = firstName;
	}

	public String getLastName() {
		return lastName;
	}

	public void setLastName(String lastName) {
		this.lastName = lastName;
	}

	public Department getDepartment() {
		return department;
	}

	public void setDepartment(Department department) {
		this.department = department;
	}

	@Override
	public String toString() {
		return "Employee [id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + "]";
	}
}
package com.howtodoinjava.demo;

import java.io.Serializable;

public class Department implements Serializable {
	
	private static final long serialVersionUID = 1L;
	
	Integer id;
	String name;
	
	public Department(Integer id, String name) {
		super();
		this.id = id;
		this.name = name;
	}
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	@Override
	public String toString() {
		return "Department [id=" + id + ", name=" + name + "]";
	}
}

Happy Learning !!

References:

SerializationUtils Java Doc

TwitterFacebookLinkedinRedditPocket

About Lokesh Gupta

A family guy with fun loving nature. Love computers, programming and solving everyday problems. Find me on Facebook and Twitter.

2
Leave a Reply

This comment form is under antispam protection
1 Comment threads
1 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
2 Comment authors
This comment form is under antispam protection
  Subscribe  
newest oldest most voted
Notify of
Matías Leonardo Daniel Juarez

Hi. I just want to point that in the first chunk of code you are doing a deep copy when it should be a shallow copy.
Anyway.. in the “complete code” section, we can see how to create a shallow copy.
Thanks for these tutorials. I’m fascinated! 😀

Vote Up0Vote Down  Reply
5 months ago
Lokesh Gupta

That was a typo. Thanks for pointing it. Cheers !!

Vote Up0Vote Down  Reply
5 months ago

Search Tutorials

Java Array

  • Java – Array Introduction
  • Java – Print Array
  • Java – Print 2D Array
  • Java – Copy Array
  • Java – Copy Array Range
  • Java – Clone Array
  • Java – Array Deep Copy
  • Java – String to String[]
  • Java – byte[] to String
  • Java – String to byte[]
  • Java – Array Union
  • Java – Array Intersection
  • Array – Remove duplicate elements

Java Collections

  • Collections Framework
  • Array
  • ArrayList
  • LinkedList
  • HashMap
  • Hashtable
  • LinkedHashMap
  • TreeMap
  • HashSet
  • LinkedHashSet
  • TreeSet
  • Comparable
  • Comparator
  • Iterator
  • ListIterator
  • Spliterator
  • PriorityQueue
  • PriorityBlockingQueue
  • ArrayBlockingQueue
  • LinkedTransferQueue
  • CopyOnWriteArrayList
  • CopyOnWriteArraySet
  • Collection Sorting
  • Interview Questions

Popular Tutorials

  • Java 8 Tutorial
  • Core Java Tutorial
  • Collections in Java
  • Java Concurrency
  • Spring Boot Tutorial
  • Spring AOP Tutorial
  • Spring MVC Tutorial
  • Spring Security Tutorial
  • Hibernate Tutorial
  • Python Tutorial
  • Jersey Tutorial
  • Maven Tutorial
  • Log4j Tutorial
  • Regex Tutorial

Meta Links

  • Advertise
  • Contact Us
  • Privacy policy
  • About Me

Recommended Reading

  • 10 Life Lessons
  • Secure Hash Algorithms
  • How Web Servers work?
  • How Java I/O Works Internally?
  • Best Way to Learn Java
  • Java Best Practices Guide
  • Microservices Tutorial
  • REST API Tutorial
  • How to Start New Blog

Copyright © 2016 · HowToDoInjava.com · All Rights Reserved. | Sitemap

wpDiscuz