关于集合框架中的transient关键字

本人在看集合框架的相关知识时看到ArrayList中的重要对象 Object[] elementData是用transient关键字修饰的,HashMap中的Node<K,V>[] table也一样,开始只知道这个关键字作用是在序列化是不会保存被修饰变量的值。

参照九劫散仙文章,写一点简单的总结:

1.ArrayList在使用transient关键字来“屏蔽”elementData的序列化的同时,自己实现了其独有的序列化方式,

for (int i=0; i<size; i++) {
            s.writeObject(elementData[i]);
        }

在序列化时使用的遍历边界是size而不是elementDate.length也就是数组的长度,这样就可以避免将数组中的null元素也一起序列化,从而节省空间和时间。

2.HashMap在实现自己的序列化和反序列化时,要考虑的的一个重要因素是因为hashCode方法是native方法,也就是本地方法,他是和具体的jvm虚拟机的运行时环境有关的,不同的虚拟机可能在实现hashCode方法时并不一样,会导致在A虚拟机进行序列化的对象在B虚拟机上反序列化时会得到意外的结果。

在HashMap反序列化时不考虑去掉null的一个简单原因是HashMap的长度是有约定为2的倍数的并且很多方法实现都是按照这个约定来的,随意去掉只会在反序列化是带来更多的麻烦,所以不考虑去null。

引用前辈的总结:当一个对象的物理表示方法与它的逻辑数据内容有实质性差别时,使用默认序列化形式有N种缺陷,所以应该尽可能的根据实际情况重写序列化方法。

注:本人这里只是简单的记录了一点关于transient关键字的小知识,因水平有限如有不对之处还请不吝赐教,另外想了解HashMap具体的序列化和反序列化的实现可以参照九劫散仙的文章。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值