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编程中,深入理解浅拷贝和深拷贝是非常重要的概念,特别是在处理对象复制时。浅拷贝和深拷贝的区别在于复制对象时对内存中数据的处理方式。 浅拷贝(Shallow Copy)指的是创建一个新的对象,该对象与原对象...
Java中的对象拷贝是一个重要的...总之,理解Java中的浅拷贝和深拷贝对于编写可维护和可扩展的代码至关重要,尤其是在处理复杂的数据结构和对象依赖时。掌握这些概念可以帮助你更好地应对面试挑战和解决实际编程问题。
在Java编程中,对象拷贝是常见...了解深拷贝和浅拷贝的概念及其在Java中的实现方式对于编写可维护和可扩展的代码至关重要。在处理包含复杂数据结构的对象时,选择正确的拷贝策略可以避免不必要的副作用和数据同步问题。
在Java开发中,理解和掌握浅拷贝与深拷贝的概念及其实现方式是非常重要的。它们不仅关乎对象的内存管理和生命周期,也是解决复杂对象管理问题的基础。根据具体情况选择合适的拷贝策略,有助于提高程序的性能和维护性...
在Java编程语言中,对象的复制是一个常见的操作,特别是在处理复杂数据...理解深拷贝和浅拷贝是优化代码、避免不必要的副作用以及确保数据完整性的关键。在编写Java代码时,根据实际需求选择合适的方法进行对象复制。
Java Clone 是 Java 语言中的一种复制对象的机制,它可以将一个对象的所有属性和状态复制到另一个对象中,实现对象的深拷贝和浅拷贝。下面我们将讨论 Java 中的深拷贝和浅拷贝的两种实现方法。 一、浅拷贝 浅拷贝...
在Java编程中,对象的复制是一个常见的操作,主要分为浅拷贝(Shallow Copy)和深拷贝(Deep Copy)。本篇文章将详细讲解Java中的浅拷贝,并通过一个完整的源码示例进行性能比较。 浅拷贝是创建一个新的对象,然后...
总的来说,Java中的深拷贝和浅拷贝是处理对象复制时的关键概念。正确理解和使用它们可以避免不必要的错误,特别是在处理复杂的对象结构时。在编写代码时,一定要根据实际情况来决定使用哪种拷贝方式,以满足程序的...
标题中的“java对象复制克隆”主要涉及的是深拷贝,这是一种创建一个新对象的方式,新对象不仅复制了原对象的所有属性,还复制了嵌套的对象引用,使得修改复制后的对象不会影响到原始对象。 **浅拷贝**:在浅拷贝中...
本文将深入探讨Java中的浅复制和深复制,并以Android为背景,结合具体的实例讲解如何实现Java泛型深拷贝。 首先,我们要理解浅复制和深复制的概念。浅复制(Shallow Copy)是指创建一个新的对象,然后将原对象引用...
在Java编程中,深拷贝和浅拷贝是两种常见的对象拷贝方式。它们主要区别在于,浅拷贝仅复制对象本身,而不复制它引用的对象;而深拷贝则会递归地复制对象及其所有引用的对象。在某些情况下,如需要完全独立的副本时,...
首先我们看看浅拷贝和深拷贝的定义 浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制 深拷贝:对象,对象内部的引用均复制 为了更好的理解它们的区别我们假设有一个对象A,它包含...
深拷贝和浅拷贝的选择取决于数据结构的特性以及应用场景的需求。了解深拷贝与浅拷贝的工作原理对于编写高效可靠的代码至关重要。同时,熟悉堆与栈的概念有助于更好地理解和优化程序的内存使用情况。在实际开发过程中...
- **构造函数**:通过对象的构造函数创建新对象,并将源对象的属性值逐一赋值给新对象,实现浅拷贝。 - **序列化与反序列化**:将对象序列化为字节数组,然后再反序列化为新的对象,实现深拷贝。 3. **注解实现...
在编程领域,尤其是在Java语言中,对象的复制是常见的操作,这涉及到两个主要概念:浅拷贝(浅复制、浅克隆)和深拷贝(深复制、深克隆)。这两个概念是理解对象生命周期和内存管理的关键部分。下面将详细阐述它们的...
如果元素是不可变的(如String、Integer等包装类),那么浅复制和深复制并无太大差异,因为这些对象一旦创建就无法改变。但对于可变对象(如自定义类实例),我们需要通过序列化和反序列化,或者手动创建新对象并...
在MyBatis中,我们通常会定义Mapper接口和XML配置文件,映射SQL语句与Java对象之间的关系。如果需要在数据库操作后复制对象,可以在Mapper接口的方法中,或者在Service层中实现对象复制。 总的来说,Java中的对象...
根据拷贝的深度,Java提供了浅拷贝和深拷贝两种方式,这两种拷贝方式处理对象属性的方式有所不同,对于含有引用类型的属性,它们的表现尤为关键。 一、浅拷贝(Shallow Copy) 浅拷贝是Java中最基础的拷贝形式,它...
这个主题涉及到Java中的浅拷贝和深拷贝概念,以及如何利用工具库如Apache Commons BeanUtils进行对象属性的便捷复制。 Apache Commons BeanUtils是一个非常实用的Java库,它提供了一系列方法来简化JavaBean的操作,...
浅拷贝通常只需复制对象头和实例变量,而深拷贝可能需要额外的内存分配和对象构造。对于复杂的对象结构,深拷贝的性能开销可能会显著高于浅拷贝。 在处理不可变对象时,浅拷贝和深拷贝的区别并不大,因为不可变对象...