当前位置: 首页 > 科技观察

说说ArrayList、Vector和LinkedList的存储性能和特点

时间:2023-03-20 20:15:38 科技观察

?面试一个工作2年的朋友,问了一个集合相关的问题。说吧,请说说ArrayList、Vector、LinkedList的存储性能和特点。今天,我就和大家分享一下我对这个问题的理解。1.存储性能和特点关于ArrayList、Vector和LinkedList的存储性能和特点,我从以下三个方面来分析:(1)首先,ArrayList和Vector的底层使用数组来存储数据,两者都是取数据根据指数。这种设计使得取数据快而插入数据慢。另外,每次扩容都要移动数组中的元素,存储数据量大时会影响读写性能。(2)其次,由于Vector中的方法都是用synchronized修饰的,所以Vector中的数据操作都是线程安全的,但是性能比ArrayList差。(3)然后,LinkedList底层使用双向链表来存储数据,也就是说将内存中分散的内存单元通过附加引用关联起来,形成一个可以通过序号索引的线性结构.这种链式存储方式与数组的连续存储方式相比,内存利用率更高。LinkedList需要根据索引号向前或者向后遍历获取数据,但是在插入数据的时候只需要记录这个item的前后两个item,所以LinkedList插入数据的速度更快。(4)最后补充一点,Vector是Java早期版本提供的容器。它是一个遗留容器,不再被官方推荐。但是由于ArrayList和LinkedListed都是非线程安全的,所以在多线程环境下,可以使用工具类Collections的synchronizedList()方法将容器转换为线程安全的容器,以便复用。这其实就是装饰者模式的一个应用。2.关于遗留容器关于Java中的遗留容器,我要补充最后一件事。除了Vector,还有Hashtable、Dictionary、BitSet、Stack、Properties都是遗留容器。在这些容器中,Properties类存在严重的设计缺陷。看看这个源代码:/*Since:JDK1.0SeeAlso:native2asciitoolforSolaris,native2asciitoolforWindowsAuthor:ArthurvanHoff,MichaelMcCloskey,XuemingShen*/publicclassPropertiesextendsHashtable{}Properties是一个特殊的键值对映射,其键和值都是字符串。应该设计成关联一个Hashtable,并将它的两个泛型参数设置为String类型,但是JavaAPI中的Properties是直接继承Hashtable,这显然是滥用继承。主要体现在以下两个方面:(1)首先,根据复合复用的原则,Properties和Hashtable之间的代码复用关系应该是Has-A关系,而不是Is-A关系。(2)另一方面,两个容器都属于工具类。继承工具类本身是一种错误的做法。工具类最好的使用方式是Has-A关系(association)或者Use-A关系(dependency)。既然我们已经涵盖了这一点,让我们扩展Stack类的设计,使其具有与Properties相同的缺陷。看这段源码:/*Since:JDK1.0Author:JonathanPayne*/publicclassStackextendsVector{}在JDK的util包中,我们发现Stack类也继承了Vector,这个设计也不合理。好了,以上就是我对ArrayList、Vector和LinkedList的理解。