How to perform a deep copy of an object in Java?
Aug 01, 2025 am 05:01 AMTo implement deep copy in Java, new objects must be created and all nested objects recursively copy to avoid sharing mutable states. The specific methods include: 1. Manual deep copy using copy constructor. The advantages are type safe and controllable, and the disadvantages are cumbersome and error-prone; 2. Use serialization to achieve deep copy through byte streams, which can automatically process complex objects but require all classes to achieve Serializable and have low performance; 3. Use SerializationUtils of Apache Commons Lang to simplify the serialization process, but is also limited by Serializable requirements; 4. Use JSON libraries such as Gson or Jackson to serialize objects to JSON and deserialize them. It is suitable for non-Serializable classes but has performance overhead and requires fields to be accessible. The selection basis includes object complexity, serialization, performance requirements and application scenarios. Since Java does not have a built-in deep copy mechanism, it is necessary to choose a suitable solution according to actual conditions.
Copying objects in Java can be tricky because the default behavior ( =
) only copies the reference, not the actual object. If you want a true deep copy , you need to create a new object and recursively copy all nested objects so that the original and the copy don't share any mutable state.

Here's how to perform a deep copy in Java:
1. Manual Deep Copy via Constructor or Method
The most straightforward (but verbose) way is to manually create a new object and copy each field, making sure to deep-copy any mutable nested objects (like lists, arrays, or other custom objects).

public class Person { private String name; private Address address; // Assume Address is a mutable class public Person(String name, Address address) { this.name = name; this.address = address; } // Deep copy constructor public Person(Person other) { this.name = other.name; this.address = new Address(other.address); // Deep copy of Address } }
And in Address
:
public class Address { private String city; public Address(String city) { this.city = city; } public Address(Address other) { this.city = other.city; } }
? Pros : Full control, type-safe, no dependencies
? Cons : Tedious for complex objects, error-prone if you forget a field

2. Using Serialization (Clone via Byte Stream)
A common workaround for deep copying is to serialize and deserialize the object. This creates a true deep copy, provided all nested objects are Serializable
.
import java.io.*; public class DeepCopy { @SuppressWarnings("unchecked") public static <T extends Serializable> T deepCopy(T object) { try { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(object); oos.flush(); ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bis); return (T) ois.readObject(); } catch (IOException | ClassNotFoundException e) { throw new RuntimeException("Deep copy failed", e); } } }
Usage:
Person original = new Person("Alice", new Address("NYC")); Person copied = DeepCopy.deepCopy(original);
? Pros : Works for complex nested objects automatically
? Cons :
- All classes must implement
Serializable
- Can be slow for large objects
- Static and transient fields are not copied
- Not all objects are serializable (eg, open files, sockets)
3. Using Third-Party Libraries (eg, Apache Commons Lang)
Apache Commons Lang provides a SerializationUtils
class that simplifies the serialization approach.
Add to pom.xml
:
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.12.0</version> </dependency>
Then use:
Person copied = (Person) SerializationUtils.clone(original);
?? Same limitations as manual serialization — everything must be Serializable
.
4. Using JSON or Other Serializers (Gson, Jackson)
You can serialize the object to JSON and then back to an object. This is useful if your objects are already JSON-friendly.
Using Gson :
Person copied = new Gson().fromJson(new Gson().toJson(original), Person.class);
? Pros : Works with non- Serializable
classes, widely used
? Cons :
- Requires all fields to be accessible (via getters/setters)
- May not handle complex object graphs (eg, cycles)
- Performance overhead
- Not truly "type-safe"
Key Points to Remember
- Shallow copy (
clone()
without override) only copy field values — references point to the same objects. - Deep copy ensures no shared mutable state.
- Always consider immutability: if your objects are immutable (eg,
String
,LocalDateTime
), shallow copy may be sufficient. - Be cautious with circular references — they can break serialization.
So, which method to choose?
- For simple objects: manual copy with a copy constructor
- For complex but serializable objects: Java serialization or Apache Commons
- For web apps with JSON: Gson/Jackson round-trip
- For performance-critical code: manual deep copy is fastest
Basically, there's no built-in deep copy in Java — you have to roll your own or use a workaround. Pick the method that fits your use case and constraints.
The above is the detailed content of How to perform a deep copy of an object in Java?. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

SetupaMaven/GradleprojectwithJAX-RSdependencieslikeJersey;2.CreateaRESTresourceusingannotationssuchas@Pathand@GET;3.ConfiguretheapplicationviaApplicationsubclassorweb.xml;4.AddJacksonforJSONbindingbyincludingjersey-media-json-jackson;5.DeploytoaJakar

Maven is a standard tool for Java project management and construction. The answer lies in the fact that it uses pom.xml to standardize project structure, dependency management, construction lifecycle automation and plug-in extensions; 1. Use pom.xml to define groupId, artifactId, version and dependencies; 2. Master core commands such as mvnclean, compile, test, package, install and deploy; 3. Use dependencyManagement and exclusions to manage dependency versions and conflicts; 4. Organize large applications through multi-module project structure and are managed uniformly by the parent POM; 5.

To generate hash values using Java, it can be implemented through the MessageDigest class. 1. Get an instance of the specified algorithm, such as MD5 or SHA-256; 2. Call the .update() method to pass in the data to be encrypted; 3. Call the .digest() method to obtain a hash byte array; 4. Convert the byte array into a hexadecimal string for reading; for inputs such as large files, read in chunks and call .update() multiple times; it is recommended to use SHA-256 instead of MD5 or SHA-1 to ensure security.

First, use JavaScript to obtain the user system preferences and locally stored theme settings, and initialize the page theme; 1. The HTML structure contains a button to trigger topic switching; 2. CSS uses: root to define bright theme variables, .dark-mode class defines dark theme variables, and applies these variables through var(); 3. JavaScript detects prefers-color-scheme and reads localStorage to determine the initial theme; 4. Switch the dark-mode class on the html element when clicking the button, and saves the current state to localStorage; 5. All color changes are accompanied by 0.3 seconds transition animation to enhance the user

Yes, a common CSS drop-down menu can be implemented through pure HTML and CSS without JavaScript. 1. Use nested ul and li to build a menu structure; 2. Use the:hover pseudo-class to control the display and hiding of pull-down content; 3. Set position:relative for parent li, and the submenu is positioned using position:absolute; 4. The submenu defaults to display:none, which becomes display:block when hovered; 5. Multi-level pull-down can be achieved through nesting, combined with transition, and add fade-in animations, and adapted to mobile terminals with media queries. The entire solution is simple and does not require JavaScript support, which is suitable for large

The settings.json file is located in the user-level or workspace-level path and is used to customize VSCode settings. 1. User-level path: Windows is C:\Users\\AppData\Roaming\Code\User\settings.json, macOS is /Users//Library/ApplicationSupport/Code/User/settings.json, Linux is /home//.config/Code/User/settings.json; 2. Workspace-level path: .vscode/settings in the project root directory

Use datetime.strptime() to convert date strings into datetime object. 1. Basic usage: parse "2023-10-05" as datetime object through "%Y-%m-%d"; 2. Supports multiple formats such as "%m/%d/%Y" to parse American dates, "%d/%m/%Y" to parse British dates, "%b%d,%Y%I:%M%p" to parse time with AM/PM; 3. Use dateutil.parser.parse() to automatically infer unknown formats; 4. Use .d

Installing the Emmet plug-in can achieve intelligent automatic closing of tags and support abbreviation syntax; 2. Enable "auto_match_enabled":true to allow Sublime to automatically complete simple tags; 3. Use Alt . (Win) or Ctrl Shift . (Mac) shortcut keys to manually close the current tag - it is recommended to use Emmet in daily life. The latter two methods can be combined, which is efficient and simple to set.
