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的效果较好.