ArrayList 和 LinkedList 的真正区别
1、ArrayList 和LinkedList结构不同
可以说ArrayList和LinkedList除了是同属于集合类,其他都是不同的,因为他们本身的实现是两种不同的实现方式,ArrayList 维护的是一个动态数组,LinkedList维护的是一个双向链表,而他们之间的不同是数组与链表的特性比较;

2、效率不同
网上很多说法都比较笼统“ArrayList查询快、LinkedList添加删除快”,经过实践后发现的结论和上面有一点不同;
2.1添加效率
用ArrayList和LinkedList分别插入1000万数据测试,ArrayList 插入1000万数据 4626 毫秒;
LinkedList 插入1000万数据 9546毫秒;
public static void main(String[] args) { ArrayList arrayList=new ArrayList(); //ArrayList插入1000万数据记时 long arrayStart=System.currentTimeMillis(); for (int i=0;i<10000000;i++){ arrayList.add(i); } long arrayInsertTime=System.currentTimeMillis()-arrayStart; System.out.println("ArryList插入数据时间:"+arrayInsertTime); }

public static void main·(String[] args) { LinkedList linkedList=new LinkedList(); //LinkedList插入1000万数据记时 long linkedStart=System.currentTimeMillis(); for (int i=0;i<10000000;i++){ linkedList.add(i); } long linkedInsertTime=System.currentTimeMillis()-linkedStart; System.out.println("LinkedList插入数据时间:"+linkedInsertTime); }

很明显普通的插入数据ArrayList要比LinkedList要快很多,可为什么普遍的说法是“LinkedList添加删除快”,这里是有前提条件的linkedList在两种情况下插入数据要比ArrayList快:
(1)往集合中间插入数据时ArrayList比linkedList慢
ArrayList往集合中间插入数据要做两个事:把之前的数据挪开赋值到新的数组位置,然后把需要插入的数据插入到数组对应位置;

LinkedList只要修改对应位置数据before 和last对象的指向就可以了

(2)ArrayList正好扩容的时候添加数据要比LinkedList慢
因为ArrayList维护的是一个数组,所以当容量到达阀值时就会进行扩容,然后会重新分配数据的位置,当数组扩容的时候速度也要比LinkedList慢;

2.2删除数据
AraayList要比LinkedList慢,原理同往集合中间插入数据一样,ArrayList每次删除数据都要对数组重组;
2.3查询数据
ArrayList比LinkedList快;
原理是:ArrayList是数组有下标标记数据位置的,查询时世界返回对应数组下表数据即可;源码如下
public E get(int index) { rangeCheck(index); return elementData(index); } //直接反回对应数组下表数据 E elementData(int index) { return (E) elementData[index]; }
LinkedList是链表,没有对数据进行位置标记,每次获取固定位置的数据都需要循环遍历链表如linkedList.get(100),就需要循环100次找到对应的节点返回,源码如下:
public E get(int index) { checkElementIndex(index); return node(index).item; } Node<E> node(int index) { // assert isElementIndex(index); if (index < (size >> 1)) { Node<E> x = first; //循环遍历链表找到对应的节点 for (int i = 0; i < index; i++) x = x.next; return x; } else { Node<E> x = last; for (int i = size - 1; i > index; i--) x = x.prev; return x; } }
