ArrayList底层使用的是一个数组来存储元素,初始容量大小为10。扩容的方式为(旧容量*3)/2+1。也就是说每次扩容大概会增加50%,如果你有一个包含大量元素的ArrayList,那么最终将会有大量的空间浪费掉。

小建议:在创建ArrayList时,要养成合理预估数据量大小,尽量在创建时就把预估容量大小初始化好。

注意:以无参数构造方法创建 ArrayList 时,实际上初始化赋值的是一个空数组。当真正对数组进行添加元素操作时,才真正分配容量。即向数组中添加第一个元素时,数组容量扩为10。

LinkedList底层采用的是一个双向链表结构(JDK1.6之前为循环链表,JDK1.7之后取消了循环。


ArrayList与LinkedList的区别

  1. ArrayList底层采用数组来保存元素,LinkedList底层采用双向链表来存储元素。

  2. ArrayList支持快速随机访问,LinkedList不支持。

  3. ArrayList的空间浪费体检在列表结尾留有一定的容量空间,LinkedList的空间浪费则体现在每个元素都需要消耗相当的空间用来存储指针和数据。

  4. ArrayList和LinkedList在尾部添加或删除一个元素的开销时间都是固定的。如果在ArrayList中间或者头部插入或删除一个元素,就意味着列表中的剩余元素都会移动,而在LinkedList中间或头部插入或删除一个元素,所用的时间是固定的。