arraylist 和 linkedlist 的区别

如题所述

ArrayList

       ArrayList是一个动态数组,也是我们最常用的集合。

它允许任何符合规则的元素插入甚至包括null。

 

每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小。

 

随着容器中的元素不断增加,容器的大小也会随着增加。

在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。

所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。

 

       size、isEmpty、get、set、iterator 和 listIterator 操作都以固定时间运行。

add 操作以分摊的固定时间运行,也就是说,添加 n 个元素需要 O(n) 时间(由于要考虑到扩容,所以这不只是添加元素会带来分摊固定时间开销那样简单)。

ArrayList擅长于随机访问。

 

同时ArrayList是非同步的。



LinkedList

       同样实现List接口的LinkedList与ArrayList不同,ArrayList是一个动态数组,而LinkedList是一个双向链表。

所以它除了有ArrayList的基本操作方法外还额外提供了get,remove,insert方法在LinkedList的首部或尾部。

 

       由于实现的方式不同,LinkedList不能随机访问,它所有的操作都是要按照双重链表的需要执行。

在列表中索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。

这样做的好处就是可以通过较低的代价在List中进行插入和删除操作。

 

       与ArrayList一样,LinkedList也是非同步的。
如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List: 

List list
= Collections.synchronizedList(new LinkedList(...));



综述:

       1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 


       2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 


       3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。 


这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList.
因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。

温馨提示:答案为网友推荐,仅供参考