天天看点

ArrayList、Vector和LinkedList的存储性能及特性。Java面试题解析。又有一位工作两年的小伙伴在面

作者:Tom弹架构

ArrayList、Vector和LinkedList的存储性能及特性。Java面试题解析。

又有一位工作两年的小伙伴在面试的时候被问到集合相关的问题说请你谈一谈ArrayList和LinkedList的存储性能和特性。今天我给大家分享一下我对这个问题的理解。当ArrayList的文字版已经整理在20万字的文档里面了,有需要的小伙伴可以在评论区领取。

关于ArrayList和LinkedList的存储性能和特性从以下3个方面给大家分析。

·首先ArrayList和Vector的底层是采用数据来存储数据的,而且都是根据索引来获取数据,这样的设计使得获取数据快,而插入数据比较慢,另外在每一次扩容的时候都要移动数组中的元素,当存储的数据量加大的时候就会影响读写性能。

·其次由于Vector中的方法都使用了synchronized修饰,因此Vector中对数组的操作都是线程全的,但是性能上比ArrayList要差一些。

·然后是LinkedList,它的底层是采用双向列表来存储数据的,也就是说它将内存中比较零散的内存单元通过一个附加的引用关联起来,然后形成一个可以按序号索引的线性结构。这种链式的存储方式和数组的连续存储方式相比内存利用率更高一些。

LinkedList获取数据的时候需要根据索引的序号向前或者向后来遍历,但是它插入数据的时候只需要记录本项的前后项就可以了,所以LinkedList插入数据的速度要更快一些。

·最后再补充一点,Vector是Java早期的版本中提供的容器,所以它是属于一个遗留容器,官方已经不再推荐使用了。

但是由于ArrayList和LinkedListed都是非线程要全的,在多线程环境下可以使用工具类Collections的一个synchronizedList()方法来将容器转换成线程要全的容器再来使用。这其实也是利用了装饰器模式的一种应用。

·2关于遗留容器。关于Java中的遗留容器,最后再补充一下,除了Vector之外还有Hashtable和Falt,都是属于遗留容器。

在这些容器中,JavaScript存在一个比较严重的设计缺陷。来看这一段源代码。·····一钱是一个键和值,都是字符串的特殊的键值对映射,在设计上应该是关联一个Hashtable,并且将它的两个泛型参数设置为String类型。

·但是在JavaAPI中,Re是直接继承了Hashtable,这很明显是对继承的泛滥。主要体现在以下两个方面。

→首先根据合成复用原则,这里的的Solar和Hashtable的代码互用关系应该是Has-A关系,而不是Is-A的关系。

→另一方面,这两个容器都是属于工具类,继承工具类本身是一个错误的做法,所以使用工具类最好的方式应该是Has-A的关系关联关系,或者是Use-A的关系依赖关系。

·既然都讲到这里了,最后再扩展一下,Stack类在设计上也存在同样的一个缺陷。来看这一段源代码,在JDK的util包中发现Stack类也继承Vector,这个设计也是不太合理的。

以上就是我对ArrayListVector和LinkedList的理解,我是被编程耽误的文艺Tom。

如果我的分享对你有帮助,请你动动手指一键三连,分享给更多的人。

关注我,面试不再难!

ArrayList、Vector和LinkedList的存储性能及特性。Java面试题解析。又有一位工作两年的小伙伴在面
ArrayList、Vector和LinkedList的存储性能及特性。Java面试题解析。又有一位工作两年的小伙伴在面
ArrayList、Vector和LinkedList的存储性能及特性。Java面试题解析。又有一位工作两年的小伙伴在面
ArrayList、Vector和LinkedList的存储性能及特性。Java面试题解析。又有一位工作两年的小伙伴在面
ArrayList、Vector和LinkedList的存储性能及特性。Java面试题解析。又有一位工作两年的小伙伴在面
ArrayList、Vector和LinkedList的存储性能及特性。Java面试题解析。又有一位工作两年的小伙伴在面
ArrayList、Vector和LinkedList的存储性能及特性。Java面试题解析。又有一位工作两年的小伙伴在面

继续阅读