先回顾一下List的框架图:
image.png
1)List 是一个接口,它继承于Collection的接口。它代表着有序的队列。 2) AbstractList 是一个抽象类,它继承于AbstractCollection。AbstractList实现List接口中除size()、get(int location)之外的函数。 3) AbstractSequentialList 是一个抽象类,它继承于AbstractList。AbstractSequentialList 实现了链表中,根据index索引值操作链表的全部方法
4)LinkedList是双向链表,同样可以被当做栈队列或双端队列使用
区别主要有:
ArrayList实现了基于动态数组的数据结构,而LinkedList是基于链表的数据结构
2) 对于随机访问get和set,ArrayList要优于LinkedList,因为LinkedList要移动指针
3) 对于添加和删除操作,虽然ArrayList要移动数据,ArrayList主要耗时是System.arraycopy动作,会移动index后面所有的元素;LinkedList主要耗时先通过for循环找到index,然后直接删除或插入
测试表明在数据量大时,LinkedList效率没有ArrayList效率高,越是插入位置靠后LinkedList越慢,大约总容量1/10时两者效率差不多。
所以一般首选ArrayList,LinkedList可实现队列,双端队列数据结构,所以在特定(首尾插入?)时候选用LinkedList,其余选择ArrayList效率更高。