1. 底层存储
private transient Object[] elementData;
private int size;
elementData 成员加上了transient关键字,该关键是在该类被序列化和反序列化的时候不参与,这是因为存放elementData是固定数组,防止没有存放元素的数组位置也被序列化,所以使用的自定义的序列化方法。
2. 构造方法
够着方法提供了两个,一个默认大小为10的数组,另一个可以指定大小的数组
3. 增加和删除
每次添加元素的时候都会检查容量是否足够,如果不够会扩容,扩容会扩大原来的1.5倍
int newCapacity = oldCapacity + (oldCapacity >> 1);
删除不进行缩容,如果数组进行一次大的扩容后,后续只使用了几个空间,可以使用
/**
* 将底层数组的容量调整为当前实际元素的大小,来释放空间。
*/
public void trimToSize() {
modCount++;
// 当前数组的容量
int oldCapacity = elementData .length;
// 如果当前实际元素大小 小于 当前数组的容量,则进行缩容
if (size < oldCapacity) {
elementData = Arrays.copyOf( elementData, size );
}
来缩小容量
4. 总结
ArrayList内部采用固定数组来存储对象的引用,当增加到固定数组以外时,需要对数组进行扩容,新申请一块原来1.5倍大小的内存,把原来的数组拷贝的新申请的数组内。由此可得,当在频繁增加的场景中,最好一次性的申请足够大的数组容量,以免频繁扩容带来的时间开销。
网友评论