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翻倍增加
对比总结
通过前面的学习,我们可以得出下面的总结:
- ArrayList底层是数组实现,它是线程不安全的,由于是数组,它的数据结构决定了它在查找上的优势,但是对于添加修改删除操作,它的效率较低。同时数组的大小由于必须是固定的,那么它需要有扩容机制,它每次扩容都是1.5倍的增长。
- LinkedList底层是双向链表实现,它也是线程不安全的,链表的特性决定了查找上效率低下,但是对于链表的添加修改删除操作就比较搞笑,同时因为是链表,不需要考虑扩容之类的问题。
- Vector底层实现和ArrayList,但是它是线程安全的,因为它的方法被synchronized关键字修饰,相较于ArrayList,它的扩容机制是每次翻倍增长的。一般情况下,如果程序是线程安全的,还是推荐使用ArrayList
最后,List的学习就到这里,基本的内容都有学习到,时常复习,才能有新的收获,才能进步,共勉,加油! :)