ArrayList源码
链接:www.cnblogs.com/zhangyinhua…
总结:ArrayList底层是个可变数组,允许存储任意元素,包括null值,非线程安全
初始容量为0,当进行add方法的时候容量会变成10
新增元素的话,是把元素添加到末尾
因为源码实现了RandomAccess接口,该接口为用来解决快速随机存取,有关效率的问题,因此可以用for循环进行遍历,效率会更高,如果没有实现该接口的话则用Iterator进行迭代。
扩容的源码:
// newCapacity 本次扩容的大小,minCapacity 我们期望的数组最小大小
// 如果扩容后的值 < 我们的期望值,我们的期望值就等于本次扩容的大小
int newCapacity = oldCapacity + (oldCapacity >> 1);
扩容的话是扩容原数组的1.5倍。(oldCapacity + (oldCapacity >>1)这个相当于oldCapacity+(oldCapacity/2) 也就是表示1.5倍)
现在假设往数组添加元素,添加到11个元素的时候,ArrayList的大小是多少?
首先,添加元素后ArrayList容量变成10,那么11的时候显然是不够用的,通过扩容1.5倍的源码,即10+10/2=15,大小即15.
如果往数组添加16个元素,ArrayList的大小是多少?
首先,默认扩容后容量会变成15,而目前数组元素是16,那么就需要再次进行扩容,15+15/2=22.5,会向下取整变成22。
remove方法的坑:千万记得如果ArrayList用remove方法的话,需要传入基本类型,如int!!!!
由于ArrayList中有2个remove方法remove(int index)、remove(Object o),如果传入包装类型的话,那么就会调用第二个remove方法,而非调用第一个删除索引的方法。
LinkedList源码
链接:www.cnblogs.com/zhangyinhua…
总结:由于实现了Deque接口,即双端队列,因此LinkedList底层是个双向链表,并且可以当队列使用,链表的特点:查询效率不高,但是增加和删除效率高。
能够存储任意元素,包括null值。
属于异步的,非线程安全。
按照顺序存取。
添加元素的话是把元素添加到LinkedList末尾,主要由linkLast()方法执行。
此外,不存在容量不足的情况