ArrayList 的数组为什么修饰成tansient
ArrayList底层是基于动态数组实现的,数组的长度是动态变化的,初始化长度为0,当添加一个元素的时候,数组的长度就会发生变化(不得不说,开发人员对内存优化的很到位)。可以看到elementData数组是transient修饰的,而被transient` 修饰的变量不会被序列化。
而对象的序列化和反序列化是通过调用方法 writeObject() 和 readObject() 完成,我们发现,ArrayList 自己实现这两个方法
假如elementData的长度为10,而其中只有5个元素,那么在序列化的时候只需要存储5个元素,而数组中后面5个元素是不需要存储的。于是将elementData定义为transient,避免了Java自带的序列化机制,并定义了两个方法,实现了自己可控制的序列化操作。