解释一下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...

面试题 相关文章推荐
C语言编程题
Mar 09 面试题
C语言如何决定使用那种整数类型
Nov 26 面试题
程序运行正确, 但退出时却"core dump"了,怎么回事
Feb 19 面试题
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
Sep 16 面试题
介绍一下linux的文件系统
Mar 20 面试题
企业面试题试卷附带答案
Dec 20 面试题
JSP和EJB可以共享HttpSession么?EJB里面可以改变session里面的内容
Jun 05 面试题
Final类有什么特点
Apr 25 面试题
Boolean b = new Boolean(“abcde”); 会编译错误码
Nov 27 面试题
JAVA程序设计笔试题面试题一套
Jul 28 面试题
创立科技Java面试题
Nov 29 面试题
UNIX文件系统常用命令
May 25 面试题
描述一下JVM加载class文件的原理机制
Dec 08 #面试题
解释一下抽象方法和抽象类
Aug 27 #面试题
康拓普公司Java笔面试
Sep 23 #面试题
会话Bean的种类
Nov 07 #面试题
你所知道的集合类都有哪些?主要方法?
Dec 31 #面试题
请说出你所知道的线程同步的方法
Apr 19 #面试题
如何强制垃圾回收
Oct 06 #面试题
You might like
如何在smarty中增加类似foreach的功能自动加载数据
2013/06/26 PHP
Yii使用ajax验证显示错误messagebox的解决方法
2014/12/03 PHP
php 将json格式数据转换成数组的方法
2018/08/21 PHP
在页面上点击任一链接时触发一个事件的代码
2007/04/07 Javascript
jquery自动完成插件(autocomplete)应用之PHP版
2009/12/15 Javascript
纯js简单日历实现代码
2013/10/05 Javascript
jquery(hide方法)隐藏指定元素实例
2013/11/11 Javascript
js获取当月最后一天实例代码
2013/11/19 Javascript
js的image onload事件使用遇到的问题
2014/07/15 Javascript
javascript多物体运动实现方法分析
2016/01/08 Javascript
深入浅析JavaScript面向对象和原型函数
2016/02/06 Javascript
JavaScript 深层克隆对象详解及实例
2016/11/03 Javascript
基于JS实现弹出一个隐藏的div窗口body页面变成灰色并且不可被编辑
2016/12/14 Javascript
Angular如何引入第三方库的方法详解
2017/07/13 Javascript
微信小程序实现拖拽 image 触摸事件监听的实例
2017/08/17 Javascript
基于js 字符串indexof与search方法的区别(详解)
2017/12/04 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
2018/07/21 Javascript
浅析js中mvvm模式实现的原理
2018/10/06 Javascript
layui 表格操作列按钮动态显示的实现方法
2019/09/06 Javascript
javascript实现支付宝滑块验证码效果
2020/07/24 Javascript
Python Tkinter基础控件用法
2014/09/03 Python
用Django实现一个可运行的区块链应用
2018/03/08 Python
Python3 itchat实现微信定时发送群消息的实例代码
2019/07/12 Python
如何使用python操作vmware
2019/07/27 Python
利用Python的turtle库绘制玫瑰教程
2019/11/23 Python
Theory美国官网:后现代都市风时装品牌
2018/05/09 全球购物
上党课的心得体会
2014/09/02 职场文书
销售业务员岗位职责
2015/02/13 职场文书
法学专业求职信范文
2015/03/19 职场文书
2015年信息宣传工作总结
2015/05/26 职场文书
党员身份证明材料
2015/06/19 职场文书
2016年“9.22”世界无车日活动小结
2016/04/05 职场文书
CSS 文字装饰 text-decoration & text-emphasis 详解
2021/04/06 HTML / CSS
python实现简单的名片管理系统
2021/04/26 Python
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL
详解Android中的TimePickerView(时间选择器)的用法
2022/04/30 Java/Android