LinkedList、ArrayList各自的使用场景,如何确认应该用哪个呢?

一言以蔽之,在大部分状况下,使用ArrayList会好一些。java

耗时上各有优缺点。ArrayList稍有优点

List只是一个接口,而LinkedList、ArrayList是List的不一样实现。LinkedList的模型是双向链表,而ArrayList则是动态数组git

首先对比下经常使用操做的算法复杂度github

LinkedList
  • get(int index) : O(n)算法

  • add(E element) : O(1)数组

  • add(int index, E element) : O(n)spa

  • remove(int index) : O(n)指针

  • Iterator.remove() : O(1) <--- LinkedList的主要优势orm

  • ListIterator.add(E element) is O(1) <--- LinkedList的主要优势接口

ArrayList
  • get(int index) : O(1) <--- ArrayList的主要优势element

  • add(E element) : 基本是O(1) , 由于动态扩容的关系,最差时是 O(n) 

  • add(int index, E element) : 基本是O( n - index) , 由于动态扩容的关系,最差时是 O(n) 

  • remove(int index) : O(n - index) (例如,移除最后一个元素,是 O(1))

  • Iterator.remove() : O(n - index)

  • ListIterator.add(E element) : O(n - index)

  • LinkedList,由于本质是个链表,因此经过Iterator来插入和移除操做的耗时,都是个恒量,但若是要获取某个位置的元素,则要作指针遍历。所以,get操做的耗时会跟List长度有关

对于ArrayList来讲,得益于快速随机访问的特性,获取任意位置元素的耗时,是常量的。可是,若是是add或者remove操做,要分两种状况,若是是在尾部作add,也就是执行add方法(没有index参数),此时不须要移动其余元素,耗时是O(1),但若是不是在尾部作add,也就是执行add(int index, E element),这时候在插入新元素的同时,也要移动该位置后面的全部元素,觉得新元素腾出位置,此时耗时是O(n-index)。另外,当List长度超过初始化容量时,会自动生成一个新的array(长度是以前的1.5倍),此时会将旧的array移动到新的array上,这种状况下的耗时是O(n)。

总之,get操做,ArrayList快一些。而add操做,二者差很少。(除非是你但愿在List中间插入节点,且维护了一个Iterator指向指定位置,这时候linkedList能快一些,可是,咱们更多时候是直接在尾部插入节点,这种特例的状况并很少)

相关文章
相关标签/搜索