解释一下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工程师面试经历
Aug 19 面试题
介绍Java的内部类
Oct 27 面试题
写一个方法1000的阶乘
Nov 21 面试题
用C或者C++语言实现SOCKET通信
Feb 24 面试题
在网络中有两台主机A和B,并通过路由器和其他交换设备连接起来,已经确认物理连接正确无误,怎么来测试这两台机器是否连通?如果不通,怎么来判断故障点?怎么排
Jan 13 面试题
C#笔试题
Jul 14 面试题
C#怎么让一个窗口居中显示?
Oct 20 面试题
介绍一下linux的文件权限
Feb 15 面试题
Linux开机引导的步骤是什么
Feb 26 面试题
EJB的几种类型
Aug 15 面试题
Vector, ArrayList, HashTable, HashMap哪些是线程安全的,哪些不是
Oct 12 面试题
Java语言程序设计测试题改错题部分
Jul 22 面试题
描述一下JVM加载class文件的原理机制
Dec 08 #面试题
解释一下抽象方法和抽象类
Aug 27 #面试题
康拓普公司Java笔面试
Sep 23 #面试题
会话Bean的种类
Nov 07 #面试题
你所知道的集合类都有哪些?主要方法?
Dec 31 #面试题
请说出你所知道的线程同步的方法
Apr 19 #面试题
如何强制垃圾回收
Oct 06 #面试题
You might like
PHP下的Oracle客户端扩展(OCI8)安装教程
2014/09/10 PHP
php简单实现快速排序的方法
2015/04/04 PHP
Yii框架通过请求组件处理get,post请求的方法分析
2019/09/03 PHP
基于jquery的一个浮动框(扩展性比较好 )
2010/08/27 Javascript
jQuery教程 $()包装函数来实现数组元素分页效果
2013/08/13 Javascript
JavaScript二维数组实现的省市联动菜单
2014/05/08 Javascript
JS实现样式清新的横排下拉菜单效果
2015/10/09 Javascript
基于javascript html5实现3D翻书特效
2016/03/14 Javascript
JS实现星星评分功能实例代码(两种方法)
2016/06/09 Javascript
JS控制FileUpload的上传文件类型实例代码
2016/10/07 Javascript
JQuery 封装 Ajax 常用方法(推荐)
2017/05/21 jQuery
React 使用recharts实现散点地图的示例代码
2018/12/07 Javascript
vue项目首屏打开速度慢的解决方法
2019/03/31 Javascript
说说如何使用Vuex进行状态管理(小结)
2019/04/14 Javascript
webpack4之如何编写loader的方法步骤
2019/06/06 Javascript
vue中watch和computed为什么能监听到数据的改变以及不同之处
2019/12/27 Javascript
vue@cli3项目模板怎么使用public目录下的静态文件
2020/07/07 Javascript
Vue 列表页带参数进详情页的操作(router-link)
2020/11/13 Javascript
Python代码解决RenderView窗口not found问题
2016/08/28 Python
Python面向对象之静态属性、类方法与静态方法分析
2018/08/24 Python
python单线程下实现多个socket并发过程详解
2019/07/27 Python
Python抓包程序mitmproxy安装和使用过程图解
2020/03/02 Python
CSS中越界问题的经典解决方案【推荐】
2016/04/19 HTML / CSS
戴尔英国翻新电脑和电子产品:Dell UK Refurbished Computers
2019/07/30 全球购物
SQL里面如何插入自动增长序列号字段
2012/03/29 面试题
shallow copy和deep copy的区别
2016/05/09 面试题
大学生收银员求职信分享
2014/01/02 职场文书
大学生表扬信范文
2014/01/09 职场文书
最新会计专业求职信范文
2014/01/28 职场文书
2014年庆元旦活动方案
2014/02/15 职场文书
文明演讲稿范文
2014/05/12 职场文书
客服专员岗位职责范本
2015/04/07 职场文书
MySQL 全文检索的使用示例
2021/06/07 MySQL
CSS Transition通过改变Height实现展开收起元素
2021/08/07 HTML / CSS
vue 实现弹窗关闭后刷新效果
2022/04/08 Vue.js
Python使用Opencv打开笔记本电脑摄像头报错解问题及解决
2022/06/21 Python