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

面试题 相关文章推荐
为什么使用接口?
Aug 13 面试题
main 主函数执行完毕后,是否可能会再执行一段代码,给出说明
Dec 05 面试题
第二层交换机和路由器的区别?第三层交换机和路由器的区别?
May 23 面试题
c++工程师面试问题
Aug 04 面试题
TCP/IP中的TCP和IP分别承担什么责任
Apr 21 面试题
abstract 可以和 virtual 一起使用吗?可以和 override 一起使用吗?
Oct 15 面试题
介绍一下Linux文件的记录形式
Apr 18 面试题
下列程序在32位linux或unix中的结果是什么
Mar 25 面试题
测试时代收集的软件测试面试题
Sep 25 面试题
传统软件工程与面向对象的软件工程有什么区别
May 31 面试题
如何开发一个JQuery插件
Jul 28 面试题
Python面试题:Python里面如何生成随机数
Mar 12 面试题
描述一下JVM加载class文件的原理机制
Dec 08 #面试题
解释一下抽象方法和抽象类
Aug 27 #面试题
康拓普公司Java笔面试
Sep 23 #面试题
会话Bean的种类
Nov 07 #面试题
你所知道的集合类都有哪些?主要方法?
Dec 31 #面试题
请说出你所知道的线程同步的方法
Apr 19 #面试题
如何强制垃圾回收
Oct 06 #面试题
You might like
使用 php4 加速 web 传输
2006/10/09 PHP
关于php curl获取301或302转向的网址问题的解决方法
2011/06/02 PHP
PHP过滤黑名单关键字的方法
2014/12/01 PHP
js textarea自动增高并隐藏滚动条
2009/12/16 Javascript
计算世界完全对称日的js代码,粗糙版
2011/11/04 Javascript
图片上传插件jquery.uploadify详解
2013/11/15 Javascript
js(JavaScript)实现TAB标签切换效果的简单实例
2014/02/26 Javascript
ExtJS4利根据登录后不同的角色分配不同的树形菜单
2014/05/02 Javascript
JS判断、校验MAC地址的2个实例
2014/05/05 Javascript
JavaScript动态修改背景颜色的方法
2015/04/16 Javascript
JQuery节点元素属性操作方法
2015/06/11 Javascript
jQuery实现简单的tab标签页效果
2016/09/12 Javascript
js判断是否为空和typeof的用法(详解)
2016/10/07 Javascript
Vue编写多地区选择组件
2017/08/21 Javascript
layer弹出子iframe层父子页面传值的实现方法
2018/11/22 Javascript
vxe-table vue table 表格组件功能
2019/05/26 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
2019/10/17 Javascript
python操作MySQL 模拟简单银行转账操作
2017/09/27 Python
python3实现163邮箱SMTP发送邮件
2018/05/22 Python
Python3 修改默认环境的方法
2019/02/16 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
2019/02/21 Python
Python如何处理大数据?3个技巧效率提升攻略(推荐)
2019/04/15 Python
Python正则表达式匹配数字和小数的方法
2019/07/03 Python
Flask框架重定向,错误显示,Responses响应及Sessions会话操作示例
2019/08/01 Python
python基于K-means聚类算法的图像分割
2019/10/30 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
CSS3中利用animation属性创建雪花飘落特效
2014/05/14 HTML / CSS
html2canvas截图空白问题的解决
2020/03/24 HTML / CSS
给排水专业应届生求职信
2013/10/12 职场文书
小学新教师培训方案
2014/02/03 职场文书
学生感冒英文请假条
2014/02/04 职场文书
法律进学校实施方案
2014/03/15 职场文书
律师催款函范文
2015/06/24 职场文书
小学班主任工作经验交流材料
2015/11/02 职场文书
史上最全的军训拉歌口号
2015/12/25 职场文书
Tomcat安装使用及部署Web项目的3种方法汇总
2022/08/14 Servers