1.ArrayList的底层实现是Object[],在内部定义了一个私有的size属性,用来记录ArrayList的长度。
2.ArrayList的默认长度是10。
private static final int DEFAULT_CAPACITY = 10;
3.关于扩容,当list已经满了后,每次扩容之后的大小是原大小的1.5倍。
int newCapacity = oldCapacity + (oldCapacity >> 1);
elementData = Arrays.copyOf(elementData, newCapacity);
// 注: >> 1 向右移动意味相当于/2; << 1 向左移动一位相当于乘以2(java8的新特性)
4.remove(index)方法的时候只会修改size的值,并不会对elementData进行容量的减少。
5.关于 transient 修饰符:当一个类实现了serializable接口,那么在序列化的时候会将所有属性自动的序列化,当加上transient修饰符那将会忽略掉这个属性。
注:我对序列化的理解是后台程序以json的格式返回给前台一个ArrayList集合,这个list编程json的过程就是序列化的过程;之后在网上看见一个解释序列化是将对象状态转换为可保持或可传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。
6.在理解transient和序列化之后,就想那么ArrayList是如何将数据序列化和反序列化的呢?答案是writeObject方法和readObject方法;这样做的目的是避免elementData中有null数据也会被序列化。