List集合源码

141 阅读2分钟

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()方法执行。

此外,不存在容量不足的情况