`
luhantu
  • 浏览: 204657 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java 深复制 浅复制

    博客分类:
  • Java
阅读更多

Java当中的copy和clone的疑惑主要是对于是否引用地址发生了根本的改变,网上有很多地方有讲解的,再次不再多说,为了便于你的理解,可以参考此链接地址的:Clone & Copy.

个人觉得就是copy就是浅复制,如果把copy的对象当做一个容器,那么只是复制了这个容器,容器里面的东西还是原来。只不过java的基本类型的特殊性,导致如果对象的属性都是基本类型时,貌似连基本属性也复制了。

clone就是深复制,就是连容器和容器里面的属性,如果属性是复杂类型的话,也全部复制,导致了生成的对象从里带外都是新的。

在这里是指做一个代码的验证。

Demo 类

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

import com.vo.Emotion;
import com.vo.Society;
import com.vo.User;

public class Dom4JDemo {

	/**
	 * @param args
	 * @throws IOException 
	 * @throws DocumentException 
	 * @throws IOException 
	 * @throws ClassNotFoundException 
	 * @throws CloneNotSupportedException 
	 */
	public static void main(String[] args) throws IOException, ClassNotFoundException, CloneNotSupportedException{
		User user1 = new User();
		user1.setName("kenny");
		Emotion emotion1 = new Emotion();
		emotion1.setName("emotion1");
		user1.setEmotion(emotion1);
		List<Society> list1 = new ArrayList<Society>();
		Society s1 = new Society();
		s1.setName("society1");
		list1.add(s1);
		user1.setSocieties(list1);
	    ByteArrayOutputStream byteout = new ByteArrayOutputStream();
	    ObjectOutputStream out = new ObjectOutputStream(byteout);
	    out.writeObject(user1);
	    ByteArrayInputStream bytein = new ByteArrayInputStream(byteout.toByteArray());
	    ObjectInputStream in = new ObjectInputStream(bytein);
	   // User newUser = (User)in.readObject();// 深复制
	    User newUser = user1.clone();//也是深复制,但是非常的繁琐,如果以后user新增了新的复杂类型,还得修改clone方法。
	    System.out.println("Before change,oldUser's emotion name=" + user1.getEmotion().getName());
	    System.out.println("Before change,newUser's emotion name=" + newUser.getEmotion().getName());
	    newUser.getEmotion().setName("emotion2");// change newUser's emotion name
	    System.out.println("After change,oldUser's emotion name=" + user1.getEmotion().getName());
	    System.out.println("After change,newUser's emotion name=" + newUser.getEmotion().getName());
	    
	    System.out.println("Before change,oldUser's society name=" + user1.getSocieties().get(0).getName());
	    System.out.println("Before change,newUser's society name=" + newUser.getSocieties().get(0).getName());
	    newUser.getSocieties().get(0).setName("society2");
	    System.out.println("After change,oldUser's society name=" + user1.getSocieties().get(0).getName());
	    System.out.println("After change,newUser's society name=" + newUser.getSocieties().get(0).getName());
	    
	    User user2 = user1.clone();
	    System.out.print(user2);
	    
	}
 }

 com.vo.Emotion 类

package com.vo;

import java.io.Serializable;

/**
 * @author:kenny dong
 */
public class Emotion implements Serializable,Cloneable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public Emotion clone() throws CloneNotSupportedException {
        return (Emotion) super.clone();
	}
}

 com.vo.society 类

package com.vo;

import java.io.Serializable;

/**
 * @author:kenny dong
 */
public class Society implements Serializable,Cloneable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public Society clone() throws CloneNotSupportedException {
        return (Society) super.clone();
	}
}

 com.vo.User 类

package com.vo;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

/**
 * @author:kenny dong
 */
public class User implements Serializable,Cloneable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String name;
	private int age;
	private Emotion emotion;
	private List<Society> societies;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Emotion getEmotion() {
		return emotion;
	}
	public void setEmotion(Emotion emotion) {
		this.emotion = emotion;
	}
	public List<Society> getSocieties() {
		return societies;
	}
	public void setSocieties(List<Society> societies) {
		this.societies = societies;
	}
	//这里面仅仅clone自己是不行的,还要手动把复杂对象挨个clone一遍才行。
	public User clone() throws CloneNotSupportedException {
		User user = (User) super.clone();
		if(emotion != null){
			user.setEmotion(emotion.clone());
		}
		List<Society> copyLists = new ArrayList<Society>();
		if(societies != null){
			for(Society s : societies){
				copyLists.add(s.clone());
			}
			user.setSocieties(copyLists);
		}
        return user;
	}
}

 

 

分享到:
评论

相关推荐

    java深复制浅复制的实现源代码

    本篇文章将深入探讨Java中的深复制和浅复制概念,并通过源代码示例进行详细解析。 首先,我们理解一下深复制和浅复制的区别: 1. **浅复制(Shallow Copy)**:浅复制只是复制了对象的引用,而不是对象本身。这...

    java List 深度复制方法

    当我们需要复制一个List时,可能会遇到浅复制和深复制的概念。浅复制只复制对象本身,而不复制它引用的对象,而深复制则会递归复制所有引用的对象。这篇博客将探讨如何在Java中对List进行深度复制。 首先,我们来...

    android 浅复制和深复制-Java Generic Deep Copy 篇

    本文将深入探讨Java中的浅复制和深复制,并以Android为背景,结合具体的实例讲解如何实现Java泛型深拷贝。 首先,我们要理解浅复制和深复制的概念。浅复制(Shallow Copy)是指创建一个新的对象,然后将原对象引用...

    java的深复制与浅复制

    ### Java的深复制与浅复制 #### 一、概述 在Java编程中,对象的复制是一个常见的需求。复制对象的目的通常是为了保留一个备份或者创建一个新的实例来避免对原始对象的修改影响到其他部分的程序逻辑。Java提供了两...

    Java深复制与浅复制.doc

    在Java编程中,复制对象是常见的操作,主要分为两种方式:浅复制(Shallow Copy)和深复制(Deep Copy)。这两种复制方式的区别在于处理对象内部引用其他对象的情况。 1. **浅复制(浅克隆)**: 浅复制是指创建一...

    Java深复制与浅复制&Clone

    在Java编程语言中,对象复制是一个常见的操作,...理解并正确使用浅复制和深复制对于开发高效、健壮的Java应用程序至关重要。在处理复杂的数据结构时,应根据需求选择合适的复制策略,以避免不必要的副作用和数据污染。

    java深度复制源代码

    在Java中,对象的复制分为浅复制和深度复制两种。浅复制是指创建一个新的对象,并将原对象的非引用类型的字段值复制到新对象中;对于引用类型的字段,只是复制了引用地址,即新旧对象共享同一份数据。而深度复制则是...

    java 深克隆浅克隆

    Java提供了两种主要的克隆方式:深克隆和浅克隆。 1. 浅克隆(Shallow Clone): 浅克隆是通过调用对象的`clone()`方法来实现的,这个方法是Object类提供的。当一个对象被浅克隆时,新创建的对象将拥有原始对象的...

    Java中的深拷贝(深复制)和浅拷贝(浅复制) 示例代码

    为了理解深拷贝(深复制)和浅拷贝(浅复制),我们需要首先了解Java对象内存的分配方式以及引用的概念。 1. **对象复制的基础** 在Java中,当我们创建一个对象时,系统会在内存中为该对象分配一块空间,存储它的...

    Java中对象的深复制和浅复制详解.doc

    对象复制分为两种主要类型:浅复制(浅克隆)和深复制(深克隆)。理解这两种复制方式的区别对于优化程序性能和避免意外数据更改至关重要。 1. **浅复制(浅克隆)** 浅复制是指创建一个新对象,该对象拥有原始...

    java 深克隆 浅克隆

    在Java编程语言中,克隆是...理解深克隆和浅克隆的概念对于编写复杂的、性能敏感的Java程序至关重要,尤其是在处理大量对象或需要保持数据独立性时。根据具体需求选择合适的克隆策略,可以提高代码的灵活性和可维护性。

    Java中的深拷贝(深复制)和浅拷贝(浅复制)介绍

    在Java编程语言中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是两种不同的对象复制方式,它们涉及到内存中数据的复制和引用的处理。理解这两种拷贝方式对于开发过程中正确管理和操作对象至关重要。 浅拷贝,又...

    理解java中的深复制和浅复制

    在Java编程中,深复制和浅复制是两个重要的概念,主要涉及到对象的复制与克隆。这两个术语在处理对象的拷贝时具有不同的含义,理解它们对于编写高效且无误的代码至关重要。 首先,让我们来看一下浅复制(Shallow ...

    JAVA中浅复制与深复制

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象。换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象。

    java不同对象之间及集合的复制

    在Java中,如果类的属性都是基本类型,可以通过构造函数或克隆方法实现浅复制。但如果属性包含引用类型,就需要深复制以确保新对象拥有独立的引用。 3. **注解实现复制**: 注解是一种元数据,可以提供编译时或运行...

    java深复制

    在Java编程语言中,深复制(深克隆)是一种创建对象副本的方法,它不仅复制了对象本身,还复制了对象引用的其他对象。这与浅复制(浅克隆)形成对比,浅复制只复制对象的直接属性,而不复制其引用的对象。在处理包含...

    android 浅复制和深复制实例

    浅复制和深复制是两种主要的复制方式,它们在处理复杂数据结构时扮演着重要角色。本文将深入探讨这两种复制方式,并通过实例来帮助理解。 ### 1. 浅复制(Shallow Copy) 浅复制是指创建一个新对象,然后将原对象...

    31.3、深复制和浅复制clone1

    在编程领域,尤其是在Java语言中,深复制和浅复制是两个重要的概念,它们与对象的复制行为密切相关。这里我们将深入探讨这两个概念,并通过实例来解释它们的区别。 首先,让我们了解基本数据类型的复制。在Java中,...

    java不同对象及集合的多次复制

    - **使用流(Stream)API**:Java 8引入的流API可以方便地实现集合到集合的复制,如`sourceList.stream().collect(Collectors.toList())`,但这仍然是浅拷贝。 - **使用`clone()`或`copy()`方法**:如果集合中的...

    Java对象深复制与浅复制实例详解

    Java对象深复制与浅复制实例详解 Java对象深复制与浅复制是Java编程中两个重要的概念,它们都是对象复制的方式,但它们有着不同的实现机制和应用场景。在本文中,我们将详细介绍Java对象深复制与浅复制的概念、实现...

Global site tag (gtag.js) - Google Analytics