在前两篇博客,学习了ArrayList和LinkedList的源码,地址在这:

Java集合(五)--LinkedList源码解读

Java集合(四)--基于JDK1.8的ArrayList源码解读

  这篇文章,对比一下ArrayList和LinkedList和Vector,主要是前面两个,因为Vector很少使用,如果考虑并发安全,也会使用

CopyOnWriteArrayList

ArrayList和LinkedList的对比:插入、修改、删除、遍历

顺序插入add(Object):

  1、ArrayList效率无疑是最好的,elementData[size++] = e;

  2、LinkedList相对而言略逊一筹,因为需要new Node(),如果对象比较大的时候,效率相对而言还是低的

非顺序插入add(index, Object):

  1、ArrayList通过System.arraycopy()方法,把index后面的所有数据都前移一位,如果数据量多,你还要插入到首位,是不是要绝望了。。。

  2、LinkedList无论插入到任何位置,只需要通过index找到node节点(这个过程使用二分法,越靠近中间的数据,效率越低),改变前后指向关系即可

我想,非顺序插入LinkedList效率无疑更好一点,但如果插入的index很靠近尾部,ArrayList肯定更好一点,因为前移的数据量很少了

修改set(index, object):

  1、ArrayList得到index对应value,直接替换即可

  2、LinkedList的消耗还是来自于通过index寻找节点的过程

ArrayList更好一点

删除remove(int):

  1、ArrayList还是需要把index后面的所有数据都前移一位

  2、LinkedList的消耗还是来自于通过index寻找节点的过程

删除remove(Object):

  1、ArrayList首先遍历得到Object对应的index,然后把index后面的所有数据都前移一位

  2、LinkedList首先遍历得到Object对应的index,然后直接改变前后指向关系即可

for循环:

  1、ArrayList使用普通for循环效率最高,而且foreach循环效率没有很大

  2、LinkedList使用Iterator效率最好,普通for循环在大数据量的情况,慢的令人发指

ArrayList使用for循环和LinkedList使用Iterator进行遍历,前者效率稍高

综上:

  ArrayList适合顺序插入或者靠近尾部的插入,修改,而且可能发生扩容,效率会降低

  LinkedList适合非顺序插入,特别是靠近两端的位置,但是如果很靠近尾部,ArrayList的效率不会比LinkedList低,没有扩容的概念

删除方面:

  ArrayList寻址比较快,而数据迁移效率比较低

  LinkedList寻址比较慢,但是只需要改变前后指向关系

至于修改:

  肯定是ArrayList效率更高的

05-11 14:44