ArrayList与LinkedList的主要区别有哪些?
主要区别
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 (LinkedList是双向链表,有next也有previous)
2.对于随机访问get和set,ArrayList绝对优于LinkedList,因为根据索引查询而LinkedList要移动指针;对于访问指定数据,ArrayList就不如LinkedList快了,因为ArrayList从索引为0开始一个一个查找,和指定数据进行比较是否相等,而LinkedList则头尾查找更快.
3.对于新增(add)和删除操作(remove),LinkedList比较占优势,因为ArrayList要移动数据位置,而LinkedList只需要断开节点连接或删除数据即可。
时间复杂度比较:
首先一点关键的是,ArrayList的内部实现是基于基础的对象数组的,因此,它使用get方法访问数组中的***任意一个元素***时(random access),它花费的时间(ArrayList时间复杂度为O(1))要比LinkedList短。LinkedList中的get方法是按照顺序从列表的一端开始检查,直到另外一端(时间复杂度为O(n))。对LinkedList而言,访问列表中的***某个指定元素***没有更快的方法了
但在某些情况下LinkedList的表现要优于ArrayList,有些算法在LinkedList中实现时效率更高。比方说,利用Collections.reverse方法对列表进行反转时,其性能就要好些。当要对list进行大量的插入和删除操作时,LinkedList也是一个较好的选择。
小结:
ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下:
1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是统一的,是分配一个内部Entry对象。
2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素的位置都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。
3.LinkedList不支持高效的随机元素访问。
可以简单记作:ArrayList查询快增删慢***,而LinkedList查询慢增删快*但是描述不是很精准