java arraylist 序列化_ArrayList的序列化与反序列化

最近在阅读ArrayList的源代码时,发现了ArrayList中的用来保存数据的数据使用了transient关键字声明。如下:

private transient Object[] elementData;

当时产生了一个疑问,难道ArrayList不可以序列化吗?但是它又实现了Serializable接口,感觉有点自相矛盾了。

public class ArrayList extends AbstractList

implements List, RandomAccess, Cloneable, java.io.Serializable

后来仔细往下阅读了代码,才发现了原因。ArrayList中实现序列化的代码如下:

private void writeObject(java.io.ObjectOutputStream s)

throws java.io.IOException{

// Write out element count, and any hidden stuff

int expectedModCount = modCount;

s.defaultWriteObject();

// Write out size as capacity for behavioural compatibility with clone()

s.writeInt(size);

// Write out all elements in the proper order.

for (int i=0; i

s.writeObject(elementData[i]);

}

if (modCount != expectedModCount) {

throw new ConcurrentModificationException();

}

}

首先通过s.defaultWriteObject();对非transient变量进行了序列化。然后又通过

for (int i=0; i

s.writeObject(elementData[i]);

}

这个循环对数组中的有值的元素逐个进行了序列化操作。

反序列化时也是一样,首先通过s.defaultReadObject();;对非transient变量进行了反序列化。然后又通过

for (int i=0; i

a[i] = s.readObject();

}

这个循环对数组中的有值的元素逐个进行反序列化操作。

之所以这样的一个原因是ArrayList的值数组elementData的大小并不一定等于数组的size的大小。size是ArrayList中add进的个数。由于ArrayList有动态扩容的机制,所以elementData的大小总是大于size.所以通过对elementData中有效的元素进行逐个的序列化可以明显的提高效率。

原文:http://blog.csdn.net/qfycc92/article/details/45370011

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值