跳到主要内容

ArrayList怎么序列化的知道吗?为什么用transient修饰数组?

参考答案:

ArrayList的序列化过程主要是通过调用writeObject(ObjectOutputStream s)方法,将size和element写入ObjectOutputStream中。而在反序列化时,则调用readObject(java.io.ObjectInputStream s)方法,从ObjectInputStream中获取到size和element,再恢复到存储集合元素的Object数组中。

至于为什么ArrayList中的数组会被transient修饰,这主要是因为transient关键字的作用是修饰的变量不被序列化。在ArrayList中,数组elementData的长度是动态变化的,初始化长度为0,当添加元素时,数组长度会发生变化。如果elementData数组没有被transient修饰,那么在序列化时,整个数组都会被序列化,包括那些未使用的部分,这会造成空间的浪费。然而,当elementData被transient修饰后,只有实际存储的元素会被序列化,这样大大提高了序列化的效率,同时也节省了存储空间。

因此,ArrayList采用这种机制,既能实现有效的序列化,又能避免不必要的空间浪费。