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

面试题 相关文章推荐
Java中compareTo和compare的区别
Apr 12 面试题
金智子午JAVA面试题
Sep 04 面试题
如果NULL和0作为空指针常数是等价的,那我到底该用哪一个
Sep 16 面试题
亿阳信通股份有限公司笔试题(C#)
Mar 04 面试题
TCP/IP中的TCP和IP分别承担什么责任
Apr 21 面试题
作为网站管理者应当如何防范XSS
Aug 16 面试题
Shell编程面试题
May 29 面试题
外包公司软件测试工程师
Nov 01 面试题
如何反序的迭代一个序列?how do I iterate over a sequence in reverse order
Feb 04 面试题
几个判断型的面试题
Jul 03 面试题
Java程序员常见面试题
Jul 16 面试题
初级Java程序员面试题
Mar 03 面试题
描述一下JVM加载class文件的原理机制
Dec 08 #面试题
解释一下抽象方法和抽象类
Aug 27 #面试题
康拓普公司Java笔面试
Sep 23 #面试题
会话Bean的种类
Nov 07 #面试题
你所知道的集合类都有哪些?主要方法?
Dec 31 #面试题
请说出你所知道的线程同步的方法
Apr 19 #面试题
如何强制垃圾回收
Oct 06 #面试题
You might like
php-accelerator网站加速PHP缓冲的方法
2008/07/30 PHP
php下删除一篇文章生成的多个静态页面
2010/08/08 PHP
深入解析PHP中的(伪)多线程与多进程
2013/07/01 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
2016/05/26 PHP
支付宝服务窗API接口开发php版本
2016/07/20 PHP
thinkphp5实现微信扫码支付
2019/12/23 PHP
js tab效果的实现代码
2009/12/26 Javascript
ajax不执行success回调而是执行了error回调
2012/12/10 Javascript
js获取电脑分辨率的思路及操作
2013/11/22 Javascript
Jquery遍历checkbox获取选中项value值的方法
2014/02/13 Javascript
js监控IE火狐浏览器关闭、刷新、回退、前进事件
2014/07/23 Javascript
详解js图片轮播效果实现原理
2015/12/17 Javascript
js简单倒计时实现代码
2016/04/30 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
解决Node.js使用MySQL出现connect ECONNREFUSED 127.0.0.1:3306的问题
2017/03/09 Javascript
JS基于正则表达式的替换操作(replace)用法示例
2017/04/28 Javascript
js自定义瀑布流布局插件
2017/05/16 Javascript
浅谈node中的exports与module.exports的关系
2017/08/01 Javascript
解决vue+elementui项目打包后样式变化问题
2020/08/03 Javascript
[03:24]DOTA2超级联赛专访hao 大翻盘就是逆袭
2013/05/24 DOTA
python实现感知器算法详解
2017/12/19 Python
python的Tqdm模块的使用
2018/01/10 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
Python微医挂号网医生数据抓取
2019/01/24 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
2019/02/07 Python
pandas数据集的端到端处理
2019/02/18 Python
Python开发网站目录扫描器的实现
2019/02/21 Python
python elasticsearch从创建索引到写入数据的全过程
2019/08/04 Python
python中字典按键或键值排序的实现代码
2019/08/27 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
Python调用钉钉自定义机器人的实现
2020/01/03 Python
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
党员对照检查材料思想汇报
2014/09/16 职场文书
离婚撤诉申请书范本
2015/05/18 职场文书
解决Go gorm踩过的坑
2021/04/30 Golang
MySQL实现字段分割一行转多行的示例代码
2022/07/07 MySQL