ArrayList和LinkedList的区别

ArrayList和LinkedList的区别

ArrayList和LinkedList在性能上各有优缺点,都有各自适用的地方,总的来说可以描述如下:

  1. 对ArrayList和LinkedList而言,在列表末尾增加一个元素所花费的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致数组重新进行分配;而对LinkedList而言,这个开销是统一的,分配一个内部Entry对象。
  2. 在ArrayList的中间插入或者删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList中间插入或删除一个元素的开销是固定的。
  3. LinkedList不支持高效的随机访问。
  4. ArrayList的空间浪费主要体现在List列表的结尾预留一定的容量空间,(数组扩容,不一定把所有的元素都用上了所以会产生浪费)而LinkedList的空间花费则体现在他的每一个元素都需要消耗相当的空间。

可以这样说:当操作在一列数据的后面添加而不是在前面或者中间,并且需要随机访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作在一列数据的前面或者尾部添加或者删除数据,就应该使用LinkedList了。

ArrayList底层是数组

get() 直接读取第几个下标,复杂度O(1)

add(E) 添加元素,直接在后面添加,复杂度O(1)

add(index ,E) 添加元素,在第几个元素后面插入,后面的元素需要向后移动,复杂度O(n)

remove() 删除元素,后面的元素需要逐个移动,复杂度O(n)

LinkedList是链表的操作

get() 获取第几个元素,依次遍历,复杂程度O(n)

add(E) 添加到末尾,复杂度O(1)

add(index,E) 添加第几个元素后,需要先找到第几个元素,直接指针指向操作,复杂度O(n)

romove() 删除元素,直接指针指向操作,复杂度O(1)

ArrayList和LinkedList的区别

简而言之:ArrayList查询速度快,LinkedList插入删除速度快。

使用场景:

  1. 如果应用程序对数据有较多的随机访问,ArrayList对象要优于LinkedList对象;
  2. 如果应用程序有更多的插入或者删除操作,较少的随机访问,LinkedList对象要优于ArrayList;
  3. 不过ArrayList的插入,删除操作也不一定比LinkedList慢,如果在List靠近末尾的地方插入,那么ArrayList只需要移动较少的数据,而LinkedList则需要一直查到列表尾部,反而耗费较多的时间,这时ArrayList就比LinkedList要快

安全性:两个是一样的

  1. ArrayList在单线程环境下是安全的,多线程环境下不是线程安全的,容易造成脏读的问题,如果要使ArrayList是线程安全的,那么可以选择使用Collections.synchronizedList(new ArrayList())
  2. LinkedList在单线程环境下是安全的,多线程环境下不是线程安全的,容易造成脏读的问题,如果要使LinkedList是线程安全的,那么可以选择使用Collections.synchronizedList(new LinkedList())

总结:https://blog.csdn.net/u012216131/article/details/82500925

https://blog.csdn.net/followMyInclinations/article/details/51347292

上一篇:ArrayList和LinkedList的区别和分别实现


下一篇:List集合