解释一下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解析URL是哪个函数?怎么用?
May 09 面试题
String和StringBuffer的区别
Aug 13 面试题
JDO的含义
Nov 17 面试题
Java中compareTo和compare的区别
Apr 12 面试题
Java提供了哪些企业应用编程接口
Feb 13 面试题
金智子午JAVA面试题
Sep 04 面试题
利用指针变量实现队列的入队操作
Apr 07 面试题
SQL Server的固定数据库角色都有哪些?对应的服务器权限有哪些?
May 18 面试题
几道数据库的概念性面试题
May 30 面试题
TCP/IP中的TCP和IP分别承担什么责任
Apr 21 面试题
Python面试题:Python里面如何生成随机数
Mar 12 面试题
编程输出如下图形
Nov 24 面试题
描述一下JVM加载class文件的原理机制
Dec 08 #面试题
解释一下抽象方法和抽象类
Aug 27 #面试题
康拓普公司Java笔面试
Sep 23 #面试题
会话Bean的种类
Nov 07 #面试题
你所知道的集合类都有哪些?主要方法?
Dec 31 #面试题
请说出你所知道的线程同步的方法
Apr 19 #面试题
如何强制垃圾回收
Oct 06 #面试题
You might like
简单的cookie计数器实现源码
2013/06/07 PHP
PHP使用xmllint命令处理xml与html的方法
2014/12/15 PHP
PHP中Http协议post请求参数
2015/11/02 PHP
PHP实现合并两个排序链表的方法
2018/01/19 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
jQuery实战之仿淘宝商城左侧导航效果
2011/04/12 Javascript
Nodejs中调用系统命令、Shell脚本和Python脚本的方法和实例
2015/01/01 NodeJs
javascript日期操作详解(脚本之家整理)
2015/09/05 Javascript
Javascript中的几种继承方式对比分析
2016/03/22 Javascript
深入浅析JavaScript中的作用域和上下文
2016/03/26 Javascript
JQuery在循环中绑定事件的问题详解
2016/06/02 Javascript
微信小程序 Record API详解及实例代码
2016/09/30 Javascript
vue路由嵌套的SPA实现步骤
2017/11/06 Javascript
实现div内部滚动条滚动到底部和顶部的代码
2017/11/15 Javascript
实例详解ztree在vue项目中使用并且带有搜索功能
2018/08/24 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
JavaScript 对引擎、运行时、调用堆栈的概述理解
2018/10/22 Javascript
Node.js Event Loop各阶段讲解
2019/03/08 Javascript
解决ant Design中Select设置initialValue时的大坑
2020/10/29 Javascript
[01:10]为家乡而战!完美世界城市挑战赛全国总决赛花絮
2019/07/25 DOTA
Python科学计算之NumPy入门教程
2017/01/15 Python
Python使用Tkinter实现机器人走迷宫
2018/01/22 Python
关于Python正则表达式 findall函数问题详解
2018/03/22 Python
Python基于OpenCV实现人脸检测并保存
2019/07/23 Python
Django 自定义分页器的实现代码
2019/11/24 Python
python实现简单日志记录库glog的使用
2019/12/13 Python
selenium学习教程之定位以及切换frame(iframe)
2021/01/04 Python
美国批发零售网站:GearXS
2016/07/26 全球购物
Booking.com荷兰:全球酒店网上预订
2017/08/22 全球购物
澳大利亚波西米亚风连衣裙在线商店:Fortunate One
2019/04/01 全球购物
幼儿园托班开学寄语
2014/01/18 职场文书
大学生就业自荐书
2014/06/16 职场文书
2014幼儿园卫生保健工作总结
2014/12/05 职场文书
2015年数学教师工作总结
2015/05/20 职场文书
常住证明范本
2015/06/23 职场文书
《多彩的民间艺术》教学反思
2016/02/16 职场文书