解释一下ArrayList Vector和LinkedList的实现和区别


Posted in 面试题 onApril 26, 2013
JDK 有几种有序集合java.util.List的实现方法,三个最熟悉的是Vector, ArrayList和LinkedList. 在Java性能方面问的比较多的就是这三个List的性能区别。

Vector和ArrayList都是基于储存元素的Object[] array来实现的,是根据索引来访问元素。Vector和ArrayList最大的区别就是synchronization(同步)的使用, 抛开两个只在序列化过程中使用的方法不说,没有一个ArrayList的方法是同步的,相反,绝大多数Vector的方法法都是直接或者间接的同步的,因 此,Vector是线程安全的而ArrayList不是,这样就造成ArrayList比Vector更快些,不过在最新的JVM中,这两个类的速度差别 是很小的,几乎可以忽略不计。

Vector和ArrayList的实现在索引访问和元素更新方面有着非常优秀的性能,因为不需要花费精力做范围检查(Range Checking),所以从Lise的末端添加元素,删除元素也有着非常优秀的性能,除非List的存储容量不足而需要扩展内部数组的长度,这种情况下插 入和删除数据需要一个数组的拷贝(当内部数组需要扩展的时候需要两次拷贝),需要拷贝的元素数量是List的长度减去索引号(也就是要插入和删除的索引号 与整个List的最后一个索引号),对插入来讲,插入元素到List的第一个位子的性能最差,插入到最后一个位子的性能最好,数组拷贝所需的时间会根据元 素的数量增加而显著增加。

LinkedList的实现

LinkedList是用双向链接节点的List实现的,根据索引访问元素的时候,你需要访问所有的节点只到到达你要的那个索引节点。往LinkedList插入元素是很简单的,只需要到达索引节点直接在这个节点前插入一个节点。

LinkedList的实现使根据索引访问元素和更新元素性能不如ArrayList和Vector好,因为你需要访问很多的节点才能到达你所要的那个节点。插入元素和删除元素跟插入和删除节点距list末端的距离有最大关系。

性能对比:

对较短的List来讲,ArrayList和Vector的性能非常接近,如果你只需要一个定长的List,Java数组(Ojbect[])的性能超过其他任何list类型。

整体来讲,ArrayList在绝大多数情况下都有着更好的性能,包括根据索引插入元素,或者插入到随即的位子,如果总是要插入数据到List的最前端,LinkedList的性能最好,但是你应该可以用反ArrayList得到更好的性能.

Tags in this post...

面试题 相关文章推荐
PHP中如何使用Cookie
Oct 28 面试题
运行时异常与一般异常有何异同?
Jan 05 面试题
空字符串(“”)和null的区别
Nov 13 面试题
北京银河万佳Java面试题
Mar 21 面试题
聚网科技C++面试笔试题
Sep 01 面试题
"引用"与多态的关系
Feb 01 面试题
DBA数据库管理员JAVA程序员架构师必看
Feb 07 面试题
what is the difference between ext2 and ext3
Aug 25 面试题
广州喜创信息技术有限公司JAVA软件工程师笔试题
Oct 17 面试题
如果Session Bean得Remove方法一直都不被调用会怎么样
Jul 14 面试题
介绍一下MYSQL常用的优化技巧
Oct 25 面试题
UNIX特点都有哪些
Apr 05 面试题
描述一下JVM加载class文件的原理机制
Dec 08 #面试题
解释一下抽象方法和抽象类
Aug 27 #面试题
康拓普公司Java笔面试
Sep 23 #面试题
会话Bean的种类
Nov 07 #面试题
你所知道的集合类都有哪些?主要方法?
Dec 31 #面试题
请说出你所知道的线程同步的方法
Apr 19 #面试题
如何强制垃圾回收
Oct 06 #面试题
You might like
PHP数据类型之整数类型、浮点数的介绍
2013/04/28 PHP
探寻PHP脚本不报错的原因
2014/06/12 PHP
PHP 抽象方法与抽象类abstract关键字介绍及应用
2014/10/16 PHP
Thinkphp结合AJAX长轮询实现PC与APP推送详解
2017/07/31 PHP
php curl获取到json对象并转成数组array的方法
2018/05/31 PHP
RSA实现JS前端加密与PHP后端解密功能示例
2019/08/05 PHP
js压缩利器
2007/02/20 Javascript
如何让div span等元素能响应键盘事件操作指南
2012/11/13 Javascript
jquery多选项卡效果实例代码(附效果图)
2013/03/23 Javascript
快速查找数组中的某个元素并返回下标示例
2013/09/03 Javascript
分享十五款 jQuery 社交网络分享插件
2015/05/16 Javascript
详解JavaScript编程中正则表达式的使用
2015/10/25 Javascript
移动端基础事件总结与应用
2017/01/12 Javascript
jQuery动态添加li标签并添加属性和绑定事件方法
2018/02/24 jQuery
解决JavaScript layui 下拉框不显示的问题
2018/08/14 Javascript
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
编写更好的JavaScript条件式和匹配条件的技巧(小结)
2019/06/27 Javascript
node.js 使用 net 模块模拟 websocket 握手进行数据传递操作示例
2020/02/11 Javascript
js实现简单进度条效果
2020/03/25 Javascript
[46:20]DOTA2-DPC中国联赛 正赛 PSG.LGD vs LBZS BO3 第二场 1月22日
2021/03/11 DOTA
Python遍历指定文件及文件夹的方法
2015/05/09 Python
Numpy 将二维图像矩阵转换为一维向量的方法
2018/06/05 Python
Python读取txt某几列绘图的方法
2018/10/14 Python
Python 确定多项式拟合/回归的阶数实例
2018/12/29 Python
python重试装饰器的简单实现方法
2019/01/31 Python
django xadmin中form_layout添加字段显示方式
2020/03/30 Python
Django中使用Json返回数据的实现方法
2020/06/03 Python
python如何使用代码运行助手
2020/07/03 Python
.NET remoting中对象激活的两种方式
2015/06/08 面试题
Linux Interview Questions For software testers
2012/06/02 面试题
自学考试自我鉴定范文
2013/09/26 职场文书
关于运动会的口号
2014/06/07 职场文书
2015年幼儿园元旦亲子活动方案
2014/12/09 职场文书
2015年征兵工作总结
2015/07/23 职场文书
快消品行业营销模式与盈利模式分享
2019/09/27 职场文书
Vue 打包后相对路径的引用问题
2022/06/05 Vue.js