Vector vs ArrayList vs LinkedList

Vector vs ArrayList vs LinkedList

一.简介

三者都实现了List接口,用法差不多,主要的区别在于它们对于不同操作的操作速度不同。

ArrayList是可以改变大小的数组。当有元素添加到ArrayList中去时,它的大小动态的增加。元素可以直接通过get()和set()方法进行访问,因此ArrayList实际上是数组。

LinkedList是个双向链表。它的add()和remove()方法比ArrayList快,但是get()和set()方法却比ArrayList慢。

Vector和ArrayList类似,但是Vector是同步的。如果在线程安全的环境下,使用ArrayList是更好的选择。添加元素的时候,当超过初始容量的时候,Vector和ArrayList需要更多的空间:Vector需要将数组的大小增加一倍,而ArrayList需要增加50%。

LinkedList还实现了Queue接口,这样就比ArrayList和Vector多出了一些方法如offer(), peek(), poll()等。

注意:ArrayList的初始容量(initial capacity)很小。我们应该设置一个比较大的初始容量,这样可以避免重新改变大小。

二. ArrayList vs Vector

相同点:
1.都是基于Object数组实现的。
2.都允许添加null元素。

不同点:
1.ArrayList不是线程安全的,Vector是线程安全的(方法是Synchronized的)。
2.ArrayList扩容后容量变为之前的1.5倍,Vector扩容后容量是之前的2倍,故ArrayList更省空间。

二.ArrayList vs LinkedList的性能比较

相同点:
都允许添加null元素。

不同点:
1.对于随机访问get和set,ArrayList比LinkedList快。
2.对于插入和删除操作,LinkedList比较快。

特点:
ArrayList的缺点:添加或删除一个元素需要移动数组中的其它元素。
LinkedList的缺点:获取一个元素时需要遍历链表(根据下标来决定是遍历链表的前半部分[从头节点遍历]还是遍历链表的后半部分[从尾节点遍历])。

结论:
从时间复杂度来说:如果对list增加或删除操作较多,则建议使用LinkedList;如果对list查询操作较多,则建议使用ArrayList。
从空间复杂度来说:LinkedList占用的空间较多(链表中的每一个节点都需要两个引用来指向它的previous节点和next节点)。

ArrayList对于任意索引的插入/删除操作的时间复杂度是O(n),而在列表的尾部的操作时间为O(1)。

LinkedList对于任意索引的插入/删除操作的时间复杂度是O(n),而在列表的头部或尾部的操作时间为O(1)。

Arrays:

  • 找到插入/删除位置的时间复杂度是O(1)
  • 进行插入/删除操作的时间复杂度是O(n)

LinkedList:

  • 找到插入/删除位置的时间复杂度是O(n)
  • 进行插入/删除操作的时间复杂度是O(1)

它们的性能的差别很显著。LinkedList对于add()和remove()相对于ArrayList要快,但是get()要慢些。按照复杂度以及测试结果来看,我们很容易知道什么时候该使用ArrayList,什么时候该使用LinkedList。简而言之,下面的情况该使用LinkedList:

  • 如果没有大量的随机访问
  • 如果有很多add/remove的操作
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值