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

面试题 相关文章推荐
会话Bean的种类
Nov 07 面试题
解释一下抽象方法和抽象类
Aug 27 面试题
JSF面试题:Jsf中导航的标签是什么
Apr 20 面试题
C语言面试题
May 19 面试题
"引用"与指针的区别是什么
Sep 07 面试题
说一下mysql, oracle等常见数据库的分页实现方案
Sep 29 面试题
一些高难度的SQL面试题
Nov 29 面试题
什么是JNDI的上下文?如何初始化JNDI上下文
Mar 10 面试题
为什么Runtime.exec(“ls”)没有任何输出?
Oct 03 面试题
几个判断型的面试题
Jul 03 面试题
送给程序员的20个Java集合面试问题
Aug 06 面试题
如何将一个描述日期或日期/时间的字符串转换为一个Date对象
Oct 13 面试题
描述一下JVM加载class文件的原理机制
Dec 08 #面试题
解释一下抽象方法和抽象类
Aug 27 #面试题
康拓普公司Java笔面试
Sep 23 #面试题
会话Bean的种类
Nov 07 #面试题
你所知道的集合类都有哪些?主要方法?
Dec 31 #面试题
请说出你所知道的线程同步的方法
Apr 19 #面试题
如何强制垃圾回收
Oct 06 #面试题
You might like
php实现mysql同步的实现方法
2009/10/21 PHP
PHP sprintf() 函数的应用(定义和用法)
2012/06/29 PHP
php实现可逆加密的方法
2015/08/11 PHP
php 微信开发获取用户信息如何实现
2016/12/13 PHP
PHP抽象类和接口用法实例详解
2019/07/20 PHP
javascript学习笔记(三)显示当时时间的代码
2011/04/08 Javascript
JavaScript根据数据生成百分比图和柱状图的实例代码
2013/07/14 Javascript
使用jQuery动态加载js脚本文件的方法
2014/04/03 Javascript
JavaScript中的类数组对象介绍
2014/12/30 Javascript
js+css实现超简洁的二级下拉菜单效果代码
2015/09/07 Javascript
详解Bootstrap四种图片样式
2016/01/04 Javascript
JavaScript ES5标准中新增的Array方法
2016/06/28 Javascript
微信小程序 数组(增,删,改,查)等操作实例详解
2017/01/05 Javascript
微信小程序中setInterval的使用方法
2017/09/29 Javascript
axios进阶实践之利用最优雅的方式写ajax请求
2017/12/20 Javascript
详解VueJs中的V-bind指令
2018/05/03 Javascript
配置eslint规范项目代码风格
2019/03/11 Javascript
Python 第一步 hello world
2009/09/25 Python
python字符串替换示例
2014/04/24 Python
Python实现短网址ShortUrl的Hash运算实例讲解
2015/08/10 Python
python读写文件write和flush的实现方式
2020/02/21 Python
python+selenium+Chrome options参数的使用
2020/03/18 Python
使用python把xmind转换成excel测试用例的实现代码
2020/10/12 Python
pytorch下的unsqueeze和squeeze的用法说明
2021/02/06 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
2021/02/25 Python
指针和引用有什么区别
2013/01/13 面试题
护士实习自我鉴定
2013/10/22 职场文书
自我鉴定注意事项
2014/01/19 职场文书
作文批改评语大全
2014/04/23 职场文书
上课睡觉检讨书300字
2014/11/18 职场文书
团代会闭幕词
2015/01/28 职场文书
如何写好开幕词?
2019/06/24 职场文书
创业计划书之寿司
2019/07/19 职场文书
详解PHP Swoole与TCP三次握手
2021/05/27 PHP
图片批量处理 - 尺寸、格式、水印等
2022/03/07 杂记
类和原型的设计模式之复制与委托差异
2022/07/07 Javascript