首先看ArrayList实现了 List ,RandomAccess , Cloneable , java.io.Serializable
其中的RandomAccess 代表其拥有随机快速访问的能力
因为其底层数据结构是数组,是占据一块连续的内存空间,所以其空间效率不高,但是可以根据下标读写(改查)元素,时间效率很高,当集合中的元素超出容量会进行扩容操作,新容量=旧容量*1.5
arraylist需要8字节来存储自己的信息,所以最大的容量就是 Integer.MAX_VALUE-8
下面来看代码,首先是构造函数
构造函数
构造函数可以指定容量也可不指定,如果不指定容量则默认返回一个空数组,在添加的时候会判断如果是空数组会默认容量大小为10 。
如果是自定义容量就会做一些判断,判断是否大于0,是否=0,超出最大值就设为最大值
添加
add()
直接添加元素(序号的顺序并不是执行的顺序,而是代表不同的方法,具体顺序看方法调用的顺序)
add(int index,E element)
addAll(Collection extends E>c)
addAll(int index, Collection extends E> c)
总结:
add、addAll。
先判断是否越界,是否需要扩容。
如果扩容, 就复制数组。
然后设置对应下标元素值。
值得注意的是:
1 如果需要扩容的话,默认扩容一半。如果扩容一半不够,就用目标的size作为扩容后的容量。
2 在扩容成功后,会修改modCount