`

java对象的浅拷贝和深拷贝

    博客分类:
  • java
 
阅读更多
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

public class Student implements Cloneable, Serializable {

	int id;

	Map<String, String> score = new HashMap<String, String>();

	public Student(int id, Map<String, String> score) {
		super();
		this.id = id;
		this.score = score;
	}

	/**
	 * 浅拷贝是按位拷贝对象,它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。如果属
	 * 性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),拷贝的就是内存地址 ,
	 * 因此如果其中一个对象改变了这个地址,就会影响到另一个对象。
	 */
	@Override
	protected Object clone() throws CloneNotSupportedException {
		// TODO 自动生成的方法存根
		return super.clone();
	}

	/**
	 * 
	 * 深拷贝会拷贝所有的属性,并拷贝属性指向的动态分配的内存。当对象和它所引用的对象一起拷贝时即发生
	 * 深拷贝。深拷贝相比于浅拷贝速度较慢并且花销较大。
	 */
	protected Object deepClone() throws CloneNotSupportedException,
			IOException, ClassNotFoundException {

		// 将对象写到流里
		ByteArrayOutputStream bo = new ByteArrayOutputStream();
		ObjectOutputStream oo = new ObjectOutputStream(bo);
		oo.writeObject(this);
		// 从流里读出来
		ByteArrayInputStream bi = new ByteArrayInputStream(bo.toByteArray());
		ObjectInputStream oi = new ObjectInputStream(bi);
		return oi.readObject();

	}

}


import java.io.IOException;
import java.util.HashMap;
import java.util.Map;


public class T {

	/**
	 * @param args
	 * @throws CloneNotSupportedException 
	 * @throws ClassNotFoundException 
	 * @throws IOException 
	 */
	public static void main(String[] args){
		// TODO 自动生成的方法存根
		
		try {
			Map<String,String> score =new HashMap<String,String>();
			score.put("English", "139");
			score.put("Math", "146");

			Student s1=new Student(1,score);
			Student s2=(Student) s1.clone();//浅拷贝
			Student s3=(Student) s1.deepClone();//深拷贝
			
			s1.score.put("Chinese", "147");
			
			System.out.println(s2.score.get("Math")+" "+s2.score.get("Chinese"));//139 147
			System.out.println(s3.score.get("Math")+" "+s3.score.get("Chinese"));//139 null
			
		} catch (Exception e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}
}
分享到:
评论

相关推荐

    java深入理解浅拷贝和深拷贝

    在Java编程中,深入理解浅拷贝和深拷贝是非常重要的概念,特别是在处理对象复制时。浅拷贝和深拷贝的区别在于复制对象时对内存中数据的处理方式。 浅拷贝(Shallow Copy)指的是创建一个新的对象,该对象与原对象...

    《剑指offer》Java浅拷贝和深拷贝.pdf

    Java中的对象拷贝是一个重要的...总之,理解Java中的浅拷贝和深拷贝对于编写可维护和可扩展的代码至关重要,尤其是在处理复杂的数据结构和对象依赖时。掌握这些概念可以帮助你更好地应对面试挑战和解决实际编程问题。

    java对象的深拷贝和浅拷贝[归类].pdf

    在Java编程中,对象拷贝是常见...了解深拷贝和浅拷贝的概念及其在Java中的实现方式对于编写可维护和可扩展的代码至关重要。在处理包含复杂数据结构的对象时,选择正确的拷贝策略可以避免不必要的副作用和数据同步问题。

    Java 细数浅拷贝和深拷贝

    在Java开发中,理解和掌握浅拷贝与深拷贝的概念及其实现方式是非常重要的。它们不仅关乎对象的内存管理和生命周期,也是解决复杂对象管理问题的基础。根据具体情况选择合适的拷贝策略,有助于提高程序的性能和维护性...

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

    在Java编程语言中,对象的复制是一个常见的操作,特别是在处理复杂数据...理解深拷贝和浅拷贝是优化代码、避免不必要的副作用以及确保数据完整性的关键。在编写Java代码时,根据实际需求选择合适的方法进行对象复制。

    Java Clone深拷贝与浅拷贝的两种实现方法

    Java Clone 是 Java 语言中的一种复制对象的机制,它可以将一个对象的所有属性和状态复制到另一个对象中,实现对象的深拷贝和浅拷贝。下面我们将讨论 Java 中的深拷贝和浅拷贝的两种实现方法。 一、浅拷贝 浅拷贝...

    Java 浅拷贝性能比较完整源码

    在Java编程中,对象的复制是一个常见的操作,主要分为浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。本篇文章将详细讲解Java中的浅拷贝,并通过一个完整的源码示例进行性能比较。 浅拷贝是创建一个新的对象,然后...

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

    总的来说,Java中的深拷贝和浅拷贝是处理对象复制时的关键概念。正确理解和使用它们可以避免不必要的错误,特别是在处理复杂的对象结构时。在编写代码时,一定要根据实际情况来决定使用哪种拷贝方式,以满足程序的...

    java对象复制克隆

    标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制了原对象的所有属性,还复制了嵌套的对象引用,使得修改复制后的对象不会影响到原始对象。 **浅拷贝**:在浅拷贝中...

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

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

    使用java反射机制实现java的深拷贝

    在Java编程中,深拷贝和浅拷贝是两种常见的对象拷贝方式。它们主要区别在于,浅拷贝仅复制对象本身,而不复制它引用的对象;而深拷贝则会递归地复制对象及其所有引用的对象。在某些情况下,如需要完全独立的副本时,...

    浅析Java中的深拷贝与浅拷贝

    首先我们看看浅拷贝和深拷贝的定义 浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制 深拷贝:对象,对象内部的引用均复制 为了更好的理解它们的区别我们假设有一个对象A,它包含...

    深拷贝拷贝的是内容,浅拷贝拷贝的是指针

    深拷贝和浅拷贝的选择取决于数据结构的特性以及应用场景的需求。了解深拷贝与浅拷贝的工作原理对于编写高效可靠的代码至关重要。同时,熟悉堆与栈的概念有助于更好地理解和优化程序的内存使用情况。在实际开发过程中...

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

    - **构造函数**:通过对象的构造函数创建新对象,并将源对象的属性值逐一赋值给新对象,实现浅拷贝。 - **序列化与反序列化**:将对象序列化为字节数组,然后再反序列化为新的对象,实现深拷贝。 3. **注解实现...

    浅拷贝(浅复制、浅克隆)、深拷贝(深复制、深克隆)实战工程

    在编程领域,尤其是在Java语言中,对象的复制是常见的操作,这涉及到两个主要概念:浅拷贝(浅复制、浅克隆)和深拷贝(深复制、深克隆)。这两个概念是理解对象生命周期和内存管理的关键部分。下面将详细阐述它们的...

    java List 深度复制方法

    如果元素是不可变的(如String、Integer等包装类),那么浅复制和深复制并无太大差异,因为这些对象一旦创建就无法改变。但对于可变对象(如自定义类实例),我们需要通过序列化和反序列化,或者手动创建新对象并...

    MyBatisDemo && JAVA把一个对象的全部属性复制到另一个相同的对象

    在MyBatis中,我们通常会定义Mapper接口和XML配置文件,映射SQL语句与Java对象之间的关系。如果需要在数据库操作后复制对象,可以在Mapper接口的方法中,或者在Service层中实现对象复制。 总的来说,Java中的对象...

    Java中的深拷贝和浅拷贝介绍

    根据拷贝的深度,Java提供了浅拷贝和深拷贝两种方式,这两种拷贝方式处理对象属性的方式有所不同,对于含有引用类型的属性,它们的表现尤为关键。 一、浅拷贝(Shallow Copy) 浅拷贝是Java中最基础的拷贝形式,它...

    java值拷贝

    这个主题涉及到Java中的浅拷贝和深拷贝概念,以及如何利用工具库如Apache Commons BeanUtils进行对象属性的便捷复制。 Apache Commons BeanUtils是一个非常实用的Java库,它提供了一系列方法来简化JavaBean的操作,...

    结合JVM解读浅拷贝和深拷贝

    浅拷贝通常只需复制对象头和实例变量,而深拷贝可能需要额外的内存分配和对象构造。对于复杂的对象结构,深拷贝的性能开销可能会显著高于浅拷贝。 在处理不可变对象时,浅拷贝和深拷贝的区别并不大,因为不可变对象...

Global site tag (gtag.js) - Google Analytics