ArrayList和LinkedList区别

ArrayList和LinkedList区别:

一句话概括:ArrayList 通过的是数组形式来存贮管理对象的,LinkedList是通过链表的方式。

 

共同点:

LinkedeList和ArrayList都实现了List接口

 

ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(references)。

 

但是它们的工作原理却不一样。

它们之间最主要的区别在于ArrayList是可改变大小的数组,而LinkedList是双向链接串列(doubly LinkedList)。

ArrayList更受欢迎,很多场景下ArrayList比LinkedList更为适用。

区别:

ArrayList进行随机访问所消耗的时间是固定的,因此随机访问时效率比较高。

LinkedList是不支持快速的随机访问的,但是在插入删除时效率比较高。

 

因为ArrayList的内部实现是基于基础的对象数组的,因此,它使用get方法访问列表中的任意一个元素时 (random access),它的速度要比LinkedList快。

LinkedList中的get方法是按照顺序从列表的一端开始检查,直到另外一端。所以随机访问时ArrayList效率明显比LinkedList效率要高。

 

但是在大量插入删除操作上LinkedList效率又明显比ArrayList要高。

 

这里要提出来说的是在开端和末端插入数据时的情况。

1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
    这一点要看实际情况的。

若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。

但若是批量随机的插入删除数据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。  

这一点我做了实验。在分别有200000条“记录”的ArrayList和LinkedList的首位插入20000条数据,LinkedList耗时约是ArrayList的20分之1。  

 

当一个元素被加到ArrayList的最开端时,所有已经存在的元素都会后移,意味着数据移动和复制上的开销,因此效率较低。

相反的,将一个元素加到LinkedList的最开端只是简单的未这个元素分配一个记录,然后调整两个连接。所以效率比较高。

 

在 LinkedList的开端增加一个元素的开销是固定的,而在ArrayList的开端增加一个元素的开销是与ArrayList的大小成比例的。

 

 

1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对 ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是 统一的,分配一个内部Entry对象。

  2.在ArrayList的中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。

  3.LinkedList不支持高效的随机元素访问。

  4.ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间

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

 

LinkedList和ArrayList的差别主要来自于Array和LinkedList数据结构的不同。如果你很熟悉Array和LinkedList,你很容易得出结论:
1) 因为Array是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。
2) 相对于ArrayList,LinkedList插入是更快的。

因为LinkedList不像ArrayList一样,不需要改变数组的大小,也不需要在数组装满的时候要将所有的数据重新装入一个新的数组,这是ArrayList最坏的一种情况,时间 复杂度是O(n),而LinkedList中插入或删除的时间复杂度仅为O(1)。

ArrayList在插入数据时还需要更新索引(除了插入数组的尾部)。
3) 类似于插入数据,删除数据时,LinkedList也优于ArrayList。
4) LinkedList需要更多的内存,因为ArrayList的每个索引的位置是实际的数据,而LinkedList中的每个节点中存储的是实际的数据和前后节点的位置。
什么场景下更适宜使用LinkedList,而不用ArrayList

我前面已经提到,很多场景下ArrayList更受欢迎,但是还有些情况下LinkedList更为合适。譬如:
1) 你的应用不会随机访问数据。因为如果你需要LinkedList中的第n个元素的时候,你需要从第一个元素顺序数到第n个数据,然后读取数据。
2) 你的应用更多的插入和删除元素,更少的读取数据。因为插入和删除元素不涉及重排数据,所以它要比ArrayList要快。
以上就是关于ArrayList和LinkedList的差别。你需要一个不同步的基于索引的数据访问时,请尽量使用ArrayList。ArrayList很快,也很容易使用。但是要记得要给定一个合适的初始大小,尽可能的减少更改数组的大小。

总结:

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

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

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

以上ArrayList和LinkedList的区别重复不止一遍了,如果你看完再理解不了那也说不过去了吧。呵呵

 

补充 Arraylist和Vector区别

List接口下一共实现了三个类:ArrayList,Vector,LinkedList。 

Arraylist和LinkedList区别上文有提到,这里就不多说了。它们的区别一般主要用在遍历数据的插入顺序的时候。

而ArrayList和Vector都是用数组实现的。

Arraylist和Vector区别:


1、Vector多线程是安全的,而ArrayList不是。Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比;

2、两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同的。

(很多网友说Vector增加原来空间的一倍,ArrayList增加原来空间的50%,其实也差不多是这个意思。)

3、Vector可以设置增长因子,而ArrayList不可以。

4、ArrayList有三个构造方法,Vector有四个构造方法。


5、Vector比Arraylist多一个构造方法,public Vector(int initialCapacity,int capacityIncrement)这个构造方法,capacityIncrement就是容量增长,前面所说的增长因子,ArrayList中是没有的。
6、Vector是同步的,ArrayList非同步,所以效率上ArrayList要比Vector高一些。
    没有一个ArrayList的方法具有同步执行的能力;相反,Vector的大多数方法具有同步能力,或直接或间接。
    所以,Vector线程安全,ArrayList线程不安全。因此ArrayList要比Vector快速。
应用场景:
    在不需要同步时应该使用ArrayList,反之使用Vector。
————————————————
版权声明:本文为CSDN博主「白衣染霜陈」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/singit/article/details/47727109

  • 17
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值