解释一下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面试题大全
Oct 16 面试题
C语言变量的命名规则都有哪些
Dec 27 面试题
VC++笔试题
Oct 13 面试题
如何打印出当前源文件的文件名以及源文件的当前行号
Apr 05 面试题
写出SQL四条最基本的数据操作语句(DML)
Dec 12 面试题
关于Assembly命名空间的三个面试题
Jul 23 面试题
Net Remoting把服务器端激活两种模式
Jan 22 面试题
如何选择使用结构还是类
May 30 面试题
linux面试题参考答案(5)
Nov 05 面试题
nohup的用法
Nov 26 面试题
EJB的基本架构
Sep 22 面试题
为什么要用EJB
Apr 17 面试题
描述一下JVM加载class文件的原理机制
Dec 08 #面试题
解释一下抽象方法和抽象类
Aug 27 #面试题
康拓普公司Java笔面试
Sep 23 #面试题
会话Bean的种类
Nov 07 #面试题
你所知道的集合类都有哪些?主要方法?
Dec 31 #面试题
请说出你所知道的线程同步的方法
Apr 19 #面试题
如何强制垃圾回收
Oct 06 #面试题
You might like
php中定义网站根目录的常用方法
2010/08/08 PHP
php数据库密码的找回的步骤
2011/01/12 PHP
基于PHP技术开发客服工单系统
2016/01/06 PHP
PHP+Ajax+JS实现多图上传
2016/05/07 PHP
PHP上传图片、删除图片简单实例
2016/11/12 PHP
Alliance vs Liquid BO3 第二场2.13
2021/03/10 DOTA
javascript 获取表单file全路径
2009/12/31 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
2011/06/27 Javascript
如何通过javascript操作web控件的自定义属性
2013/11/25 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
微信页面倒计时代码(解决safari不兼容date的问题)
2016/12/13 Javascript
Vue.js中的图片引用路径的方式
2017/07/28 Javascript
在小程序Canvas中使用measureText的方法示例
2018/10/19 Javascript
微信小程序select下拉框实现效果
2019/05/15 Javascript
nodejs实现UDP组播示例方法
2019/11/04 NodeJs
使用JS location实现搜索框历史记录功能
2019/12/23 Javascript
vue学习之Vue-Router用法实例分析
2020/01/06 Javascript
[19:59]2014DOTA2国际邀请赛 IG战队纪录片
2014/08/07 DOTA
[05:26]TI10典藏宝瓶套装外观展示
2020/07/03 DOTA
[01:06:59]完美世界DOTA2联赛PWL S2 Magma vs FTD 第一场 11.29
2020/12/02 DOTA
Python中文编码那些事
2014/06/25 Python
Python的Django框架中的数据库配置指南
2015/07/17 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
2018/06/04 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
Python设计模式之观察者模式原理与用法详解
2019/01/16 Python
如何用Python做一个微信机器人自动拉群
2019/07/03 Python
Python实现直播推流效果
2019/11/26 Python
python 字典item与iteritems的区别详解
2020/04/25 Python
解决numpy矩阵相减出现的负值自动转正值的问题
2020/06/03 Python
python用opencv 图像傅里叶变换
2021/01/04 Python
电子商务专业学生的自我鉴定
2013/11/28 职场文书
八年级物理教学反思
2014/01/19 职场文书
党的群众路线教育实践活动领导班子整改措施
2014/10/28 职场文书
前台文员岗位职责
2015/02/04 职场文书
幼儿园开学家长寄语(2015秋季)
2015/05/27 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书