java深拷贝与浅拷贝、java序列化

浅拷贝与深拷贝

浅拷贝就是指两个对象共同拥有同一个值,一个对象改变了该值,也会影响到另一个对象。深拷贝就是两个对象的值相等,但是互相独立。

Java中常用的拷贝操作有三个,operator =、拷贝构造函数和 clone()方法。由于Java不支持运算符重载,我们无法在自己的自定义类型中定义operator=。拷贝构造函数大家应该很熟悉,如果我们要使自己定义的对象能够深拷贝,就改写从 Object继承而来的 clone方法,使它的访问权限为 public,因为为了防止意外的支持 clone操作,Object的 clone方法是 protected权限。

java深拷贝与浅拷贝、java序列化

from : http://blog.csdn.net/jiadongfengyahoo/article/details/7973252

浅拷贝:

http://git.oschina.net/memristor/javalab/blob/master/javalab/src/basic/Test/CopyTestShallow.java

深拷贝:

深拷贝,需要实现cloneable接口的clone方法,将属性中的自定义对象在clone中分别clone

http://git.oschina.net/memristor/javalab/blob/master/javalab/src/basic/Test/CopyTestDeep.java

利用序列化来做深复制,把对象写到流里的过程是序列化(Serilization)过程,而把对象从流中读出来的过程则叫做反序列化(Deserialization)过程。应当指出的是,写在流里的是对象的一个拷贝,而原对象仍然存在于JVM里面。,利用这个特性,可以做深拷贝

java序列化

http://developer.51cto.com/art/201202/317181.htm

Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,这些对象的生命周期不会比JVM的生命周期更长。但在现实应用中,就可能要求在JVM停止运行之后能够保存(持久化)指定的对象,并在将来重新读取被保存的对象。Java对象序列化就能够帮助我们实现该功能。除了在持久化对象时会用到对象序列化之外,当使用RMI(远程方法调用),或在网络中传递对象时,都会用到对象序列化。

使用Java对象序列化,在保存对象时,会把其状态保存为一组字节,在未来,再将这些字节组装成对象。必须注意地是,对象序列化保存的是对象的"状态",即它的成员变量。由此可知,对象序列化不会关注类中的静态变量。

如果被写对象的类型是String,或数组,或Enum,或Serializable,那么就可以对该对象进行序列化,否则将抛出NotSerializableException。

如果仅仅只是让某个类实现Serializable接口,而没有其它任何处理的话,则就是使用默认序列化机制。使用默认机制,在序列化对象时,不仅会序列化当前对象本身,还会对该对象引用的其它对象也进行序列化,同样地,这些其它对象引用的另外对象也将被序列化,以此类推。所以,如果一个对象包含的成员变量是容器类对象,而这些容器所含有的元素也是容器类对象,那么这个序列化的过程就会较复杂,开销也较大

无论是实现Serializable接口,或是Externalizable接口,当从I/O流中读取对象时,readResolve()方法都会被调用到。实际上就是用readResolve()中返回的对象直接替换在反序列化过程中创建的对象。如果是单例模式下的话,可以在readResolve中直接返回单例对象。

你可能感兴趣的:(java深拷贝与浅拷贝)