本文是借鉴的一位前辈的总结,重新编辑一下收藏了.
首先看看浅拷贝和深拷贝的定义
浅拷贝:只复制一个对象,对象内部存在的指向其他对象数组或者引用则不复制
深拷贝:对象,对象内部的引用均复制
为了更好的理解它们的区别我们假设有一个对象A,它包含有2对象对象A1和对象A2
对象A进行浅拷贝后,得到对象B但是对象A1和A2并没有被拷贝
对象A进行深拷贝,得到对象B的同时A1和A2连同它们的引用也被拷贝
在理解了深拷贝和浅拷贝后,我们来看看Java的深拷贝和浅拷贝实现。
java.lang.Object的clone()方法默认是返回一个浅拷贝对象。
因此如果要用clone()方法实现一个深拷贝,我们必须对每个对象的clone()方法进行特别实现。
当对象层次复杂的时候,这样做不但困难而且浪费时间和容易出现错误,
特别有时候你不但需要深拷贝同时你也对这个对象进行浅拷贝的时候,你会发现写这个clone()方法真不是一个好的解决方案。
那么除了clone()方法,我们还可以怎么实现呢?答案是序列化。
实现步骤和思路是把要拷贝的对象输出成byte array,然后再利用ObjectInputStream转换出新的对象。下面是代码:
public static Object copy(Object oldObj)
{
Object obj = null;
try { // Write the object out to a byte array
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(bos);
out.writeObject(oldObj);
out.flush();
out.close();
// Retrieve an input stream from the byte array and read
// a copy of the object back in.
ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream in = new ObjectInputStream(bis);
obj = in.readObject();
}catch(IOException e)
{
e.printStackTrace();
}catch(ClassNotFoundException cnfe)
{
cnfe.printStackTrace();
}
return obj;
}
分享到:
相关推荐
此时,可以利用序列化实现深拷贝的方法来达到这一目的。本文将详细介绍如何通过序列化实现深拷贝以及如何实现`DataGridView`的初始化刷新。 首先,深拷贝是指创建一个对象的新副本,这个副本与原对象完全相同,包括...
对于深拷贝,我们通常会利用序列化和反序列化的方法,但这可能会导致性能损失,尤其是在处理大型对象或循环引用时。而使用表达式树可以更高效地创建深拷贝,因为它允许我们在运行时动态生成代码,避免了序列化的开销...
在C#中,可以使用几种不同的方法来实现深拷贝,如手动实现、序列化/反序列化、反射等。 1. 手动实现:针对每个类,编写复制所有字段的构造函数或方法。 2. 序列化/反序列化:利用`BinaryFormatter`或`XmlSerializer...
实现深拷贝通常需要自定义代码或者使用序列化和反序列化的方法。 在WinForm应用中,可能遇到需要深拷贝控件、数据绑定对象或者其他复杂对象的情况。例如,如果你有一个自定义控件,其中包含了其他控件或复杂的业务...
3. **网络传输**:介绍如何利用序列化将对象发送到网络的另一端,这对于分布式系统和RPC(远程过程调用)非常重要。 4. **序列化版本ID(serialVersionUID)**:当类的结构发生变化时,系统会使用此ID来检查序列化...
本文将探讨如何利用Java的反射机制来实现深拷贝。 首先,我们需要了解Java反射的基本概念。反射是Java提供的一种动态类型能力,允许程序在运行时检查类、接口、字段和方法的信息,并能直接操作这些对象。通过`Class...
以下是如何使用序列化实现List实例深复制的步骤: 1. 首先,创建一个辅助类`SerializLog`,该类包含一个静态方法`Clone<T>`,它接受一个泛型参数T,代表要复制的对象类型。 2. 在`Clone<T>`方法中,我们创建一个`...
首先,要使用序列化实现对象克隆,对象必须实现`Serializable`接口。这是一个标记接口,没有定义任何方法,但它的存在表明这个类的对象可以被序列化。例如: ```java public class MyClass implements Serializable...
- **序列化和反序列化**:如果实体类实现了`Serializable`接口,可以利用`ObjectOutputStream`和`ObjectInputStream`进行序列化和反序列化实现深拷贝。这种方式的优点是简单,但缺点是效率较低,且所有属性都需要...
2. **利用XML序列化和反序列化实现深拷贝**: XML序列化是将对象转换为XML格式的过程,反序列化则是将XML还原为对象。在C#中,`XmlSerializer`类可以实现这一过程。这个方法将对象序列化到内存流,然后从流中反序列...
上述代码展示了如何通过序列化和反序列化来实现深拷贝。首先,创建一个 `BinaryFormatter` 对象和一个 `MemoryStream` 对象。然后,将当前对象序列化到 `MemoryStream` 中,接着重新定位到流的起始位置,最后从流中...
实现深拷贝通常需要手动编写代码,或者利用序列化和反序列化的方法。例如,可以通过创建一个新的对象,并逐个复制原对象的属性(包括引用类型的属性),或者使用序列化库(如Google的Gson或Apache的BeanUtils)来...
实现深拷贝的一种常见方式是利用序列化(Serialization)机制。具体步骤如下: 1. 实现`Serializable`接口。 2. 通过序列化将对象转换成字节流。 3. 通过反序列化将字节流转换回新的对象。 示例代码如下: ```java...
如果对象不适合或者不方便通过序列化实现深拷贝,可以利用第三方库如`net.sf.json.JSONObject`(这里假设已经引入了该库),将对象转换为JSON字符串,然后再转换回对象。 ```java import net.sf.json.JSONObject; ...
在Java编程中,数组复制是常见的操作,有多种方法可以实现。下面我们将详细探讨这些方法,包括它们的原理、效率以及适用场景。...而进行深拷贝时,对于包含复杂对象结构的组合类,需要利用序列化和反序列化来实现。
这种方法利用了JSON的序列化和反序列化特性。首先将对象转换为JSON字符串,然后解析该字符串以创建新的对象。但是,这种方法存在局限性,因为它不能处理函数、循环引用、undefined等非JSON兼容的值。 ```javascript...
通过遍历对象的所有属性,然后为新对象添加这些属性,可以实现深拷贝。这适用于包含任意类型属性的对象,但性能较低。 ```javascript function deepCopy(obj) { let copy = Array.isArray(obj) ? [] : {}; for ...
在编程领域,特别是使用.NET...无论是手动实现,还是利用序列化或接口,都需要确保正确处理嵌套对象,以达到完整独立的拷贝效果。在设计类时,考虑拷贝行为也是一种良好的编程实践,特别是当对象包含复杂数据结构时。