`

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();
		}
	}
}
分享到:
评论

相关推荐

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

    Java 对象拷贝是为对象赋值的一种方式,简单来说就是创建一个和原对象相同的对象,新创建的对象是原对象的一个副本,面试官贼拉喜欢在面试的时候问一问你浅...所以在聊深拷贝和浅拷贝之前,我们先来聊一聊引用关系。

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

    本文将会深入的探讨一下在拷贝对象中会出现的浅拷贝和深拷贝的情况。 拷贝接口 java中所有的对象都是继承自java.lang.Object。Object对象中提供了一个clone方法,来供我们对java对象进行拷贝。 protected native ...

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

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

    Java 细数浅拷贝和深拷贝

    Java 对象拷贝是为对象赋值的一种方式,简单来说就是创建一个和原对象相同的对象,新创建的对象是原对象的一个`副本`,面试官贼拉喜欢在面试的时候问一问你浅拷贝和深拷贝的原理。因为它涉及到对象的引用关系,涉及...

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

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

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

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

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】 * 原型模式(Prototype) * 实现方式: * 需要被克隆的 class类, 重写Object中的clone()方法,并实现Cloneable接口(否则报错 ...

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

    对象拷贝(Object Copy)就是将一个对象的属性拷贝到另一个有着相同类类型的对象中去。在程序中拷贝对象是很常见的,主要...Java中有三种类型的对象拷贝:浅拷贝(Shallow Copy)、深拷贝(Deep Copy)、延迟拷贝(Lazy Copy)

    java 面对对象编程.pdf.zip

    深拷贝和浅拷贝区别了解吗?什么是引用拷贝? Java 常见类 Object Object 类的常见方法有哪些? == 和 equals() 的区别 hashCode() 有什么用? 为什么要有 hashCode? 为什么重写 equals() 时必须重写 hashCode() ...

    Python中的深拷贝和浅拷贝详解

    变量-引用-对象(可变对象,不可变对象)-切片-拷贝(浅拷贝,深拷贝) 【变量-对象-引用】 在Python中一切都是对象,比如说:3, 3.14, ‘Hello’, [1,2,3,4],{‘a’:1}…… 甚至连type其本身都是对象,type对象 Python...

    javascript二维数组和对象的深拷贝与浅拷贝实例分析

    本文实例讲述了javascript二维数组和对象的深拷贝与浅拷贝。分享给大家供大家参考,具体如下: 这篇文章主要为大家详细介绍了js实现数组和对象的深浅拷贝, 1.浅拷贝: 将原对象或原数组的引用直接赋给新对象,新...

    javascript对浅拷贝和深拷贝的详解

    下面小编就为大家带来一篇浅谈JavaScript中面向对象的的深拷贝和浅拷贝。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。 1.浅拷贝:复制一份引用,所有引用对象都指向一份数据,并且都可以修改这份数据。 ...

    NDK13_C++基础:构造函数、拷贝构造函数、浅拷贝与深拷贝.zip

    在java中执行这个语句,只是开辟了一块内存空间,并没初始化和赋值对象, 必须用new关键字,来进行初始化和赋值 ———————————————— 版权声明:本文为CSDN博主「鱼包子Ray」的原创文章,遵循 CC ...

    Python 赋值,浅拷贝,深拷贝

    浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。 深拷贝(deepcopy): copy模块的deepcopy方法,完全拷贝了父对象及其子对象。 1 基础概念 在Python里,一切皆对象,完全的面向对象。 1、Python为动态解释性...

    浅谈Java中实现深拷贝的两种方式—clone() & Serialized

    主要介绍了Java中实现深拷贝的两种方式—clone() & Serialized,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    Java实例高难度面试题及解析 - 展现你的编程实力!

    您将了解如何正确创建对象实例、访问实例的成员变量和方法、实现对象的拷贝(包括浅拷贝和深拷贝)、判断对象相等性、管理对象的生命周期、实现线程安全的单例模式等。此外,我们还探讨了对象的哈希码、重写equals()...

    浅析javaScript中的浅拷贝和深拷贝

    1、javaScript的变量类型 ...JavaScript存储对象都是存地址的,所以浅拷贝会导致 obj1 和obj2 指向同一块内存地址。改变了其中一方的内容,都是在原来的内存上做修改会导致拷贝对象和源对象都发生改变,而

    java中的指针,引用及对象的clone

    java中clone的详细用法,分浅拷贝和深拷贝,并分别有详细的实例介绍。从原理分析。

    javascript深拷贝、浅拷贝和循环引用深入理解

    一、为什么有深拷贝和浅拷贝? 这个要从js中的数据类型说起,js中数据类型分为基本数据类型和引用数据类型。 基本类型值指的是那些保存在栈内存中的简单数据段,即这种值是完全保存在内存中的一个位置。包含Number...

    javascript中数组深拷贝途径及对象数组深拷贝

    javascript中数组深拷贝途径及对象数组深拷贝 什么是浅拷贝 在js当中,我们常常遇到数组复制的的情况,许多人一般都会使用“=”来直接把一个数组赋值给一个变量,如: var a=[1,2,3]; var b=a; console.log(b); ...

Global site tag (gtag.js) - Google Analytics