转载

深入剖析ArrayList源码

概念

ArrayList 是一个其容量能够 动态增长 的动态数组

继承关系图:

深入剖析ArrayList源码

我们从源码角度看一下:

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable{
//默认容量大小            
private static final int DEFAULT_CAPACITY = 10;

//指定ArrayList容量为0时返回该数组
private static final Object[] EMPTY_ELEMENTDATA = {};

//当没有指定ArrayList容量时返回该数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};


transient Object[] elementData; 

//ArrayList中元素数量
private int size;

总结

10
elementData

注意:可以看到elementData被 transient 标识,代表elementData无法被序列化,为什么要这么设置呢?

因为elementData里面不是所有的元素都有数据,因为容量的问题,elementData里面有一些元素是空的,这种是没有必要序列化的。

ArrayList的序列化和反序列化依赖writeObject和readObject方法来实现。可以避免序列化空的元素。

原文  https://segmentfault.com/a/1190000020602371
正文到此结束
Loading...