9、集合--ArrayList和LinkedList的一些对比

ArrayList:顺序存储结构(数组)

1、ArrayList自己实现了序列化和反序列化的方法,因为它自己实现了 private void writeObject(java.io.ObjectOutputStream s)和

   private void readObject(java.io.ObjectInputStream s) 方法


2、ArrayList基于数组方式实现,无容量的限制(会扩容)


3、添加元素时可能要扩容(所以最好预判一下),删除元素时不会减少容量(若希望减少容量,trimToSize()),

  删除元素时,将删除掉的位置元素置为null,下次gc就会回收这些元素所占的内存空间。


4、线程不安全


5、add(int index, E element):添加元素到数组中指定位置的时候,需要将该位置及其后边所有的元素都整块向后复制一位


6、get(int index):获取指定位置上的元素时,可以通过索引直接获取(O(1))


7、remove(Object o)需要遍历数组


8、remove(int index)不需要遍历数组,只需判断index是否符合条件即可,效率比remove(Object o)高

9、contains(E)需要遍历数组

10、使用iterator遍历可能会引发多线程异常

LinkedList:(链式存储)是双向列表

1、LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。

2、LinkedList 实现 List 接口,能对它进行队列操作。

3、LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。

4、LinkedList 实现了Cloneable接口,即覆盖了函数clone(),能克隆。

5、LinkedList 实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。

6、LinkedList 是非同步的。

7、LinkedList相对于ArrayList来说,是可以快速添加,删除元素,ArrayList添加删除元素的话需移动数组元素,可能还需要考虑到扩容数组长度。

8、LinkedList是基于链表实现的,因此插入删除效率高,查找效率低

9、LinkedList是基于链表实现的,因此不存在容量不足的问题,所以这里没有扩容的方法

多数情况下如果查询操作较多ArrayList的效果更好.如果删除,插入较多LinkedList的效果较好.

原文地址:https://www.cnblogs.com/Mrchengs/p/10848882.html