「重学Java集合」ArrayList、LinkedList、Vector对比与小结

Java集合:ArrayList、LinkedList、Vector对比与小结


参考学习

  • 此处膜拜大佬,五体投地
  • https://www.pdai.tech/md/java/collection/java-collection-LinkedList.html
  • https://blog.csdn.net/zxt0601/article/details/77341098

被遗忘的Vector

在List中,还有一个不常用但是面试时候总要提到的一个类Vector,它比较特殊,底层的代码实现几乎和ArrayList一致,所以我没有专门去总结Vector的源码,而是粗略的阅读了一遍。结合网上各路大神总结的Vector和ArrayList的区别,针对性的学习了下。

刚开始学习ArrayList、LinkedList的时候,很多博客文章都说它们是线程不安全的,但是又没有说为什么,对于我一个小白来说,这个无疑让我很困惑。

知道我学习了Vector之后,我发现Vector的代码和ArrayList基本一致,但**是有一个很明显的地方就是Vector中几乎所有的方法都是用synchronized关键字修饰的,但是同样的方法在ArrayList中却没有synchronized关键字修饰。**这里就可以很明显的看到为什么ArrayList大家都说它是线程不安全的,因为没有synchronized关键字修饰,ArrayList允许多个线程同时方法它的方法,在多线程并发访问同一个ArrayList的情况下进行某些修改操作的时候,就会出现线程安全问题,造成数据不一致。但是Vector由于synchronized关键字修饰,就可以避免这个问题。

线程安全,这就是Vector和ArrayList、LinkedList最主要的区别

除此之外,Vector还有部分细节上与ArrayList实现有所不同,比如,ArrayList中的自动扩容是增量1.5倍(右移一位),而Vector翻倍增加

image-20201014113619621

对比总结

通过前面的学习,我们可以得出下面的总结:

  1. ArrayList底层是数组实现,它是线程不安全的,由于是数组,它的数据结构决定了它在查找上的优势,但是对于添加修改删除操作,它的效率较低。同时数组的大小由于必须是固定的,那么它需要有扩容机制,它每次扩容都是1.5倍的增长。
  2. LinkedList底层是双向链表实现,它也是线程不安全的,链表的特性决定了查找上效率低下,但是对于链表的添加修改删除操作就比较搞笑,同时因为是链表,不需要考虑扩容之类的问题。
  3. Vector底层实现和ArrayList,但是它是线程安全的,因为它的方法被synchronized关键字修饰,相较于ArrayList,它的扩容机制是每次翻倍增长的。一般情况下,如果程序是线程安全的,还是推荐使用ArrayList

最后,List的学习就到这里,基本的内容都有学习到,时常复习,才能有新的收获,才能进步,共勉,加油! :)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值