java面试(5)--序列化与浅拷贝深拷贝

使用序列化的情形:

(1)需要通过网络来发送对象,或对象的状态需要被持久化到数据库或文件中

(2)序列化能够实现深复制,即可以复制引用的对象

 

浅拷贝

对象实现的接口Cloneable的clone()方法存在一个缺陷,它并不会将对象的所有属性全部拷贝过来,而是有选择性的拷贝,即浅拷贝!基本规则如下:

      1、 基本类型

         如果变量是基本很类型,则拷贝其值,比如int、float等。

      2、 对象

         如果变量是一个实例对象,则拷贝其地址引用,也就是说此时新对象与原来对象是公用该实例变量。

      3、 String字符串

         若变量为String字符串,则拷贝其地址引用。但是在修改时,它会从字符串池中重新生成一个新的字符串,原有字符串对象保持不变。

所以:浅拷贝只是Java提供的一种简单的拷贝机制,不便于直接使用。

 

 

如何利用序列化来完成对象的拷贝呢?在内存中通过字节流的拷贝是比较容易实现的。把母对象写入到一个字节流中,再从字节流中将其读出来,这样就可以创建一个新的对象了,并且该新对象与母对象之间并不存在引用共享的问题,真正实现对象的深拷贝。

 

 

显式声明serialVersionUID主要有以下三个优点:

(1) 提高程序的运行效率,如果在类中没有显式的声明serialVersionUID,那么序列化时会通过计算得到一个seralVersionUID值,这样会增加一个计算的过程。

(2)提高程序不同平台的兼容性,由于各个平台的编译器在计算UID的时候有可能采取完全不同的计算方式,这会导致在一个平台上的序列化对象在另一个平台上将无法实现反序列化的操作。通过显式的声明完全可以避免这样的问题发生。

(3)增强程序个版本的兼容性。在默认情况下,每个类都有惟一的UID,因此在后期对类进行修改时,类的UID将会发生改变,这将导致在修改前对象序列化的文件,在修改后无法进行反序列化。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值