ArrayList、LinkedList、Vector区别
2015-08-04 14:58
316 查看
java.util包提供了3个List接口的实现类:ArrayList、LinkedList、Vector。
ArrayList和Vector类都使用数组方式存储数据,数组元素数大于实际存储的数据数目,以便增加和插入元素。它们都允许直接按序号索引元素,但是插入元素涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。Vector由于使用了synchronized方法(线程安全),通常性能上校ArrayList差。LinkedList使用双向链表是实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时,只需要记录本项的前后项即可,所以插入速度较快。
LinkedList类实现了List接口,允许包含null元素。
注意:LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List,
ArrayList实现了可变大小的数组,它允许包含所有类型的元素,包括null元素。每个ArrayList实例都有一个容量(Capacity),用于存储元素的数组的大小。这个容量可随着不断添加的新的元素而自动增加。当需要插入大量元素时,在插入前可以调用ensureCapacity()方法来增加ArrayList的容量以提高插入效率。非线程安全。
Vector非常类似ArrayList,但是Vector是线程安全的,是同步的。
1. Vector & ArrayList
1) Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
2) 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。
2. Hashtable & HashMap
Hashtable和HashMap它们的性能方面的比较类似 Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是。
3. ArrayList & LinkedList
ArrayList的内部实现是基于内部数组Object[],所以从概念上讲,它更象数组,但LinkedList的内部实现是基于一组连接的记录,所以,它更象一个链表结构,所以,它们在性能上有很大的差别:
从上面的分析可知,在ArrayList的前面或中间插入数据时,你必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以,当你的操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能; 而访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止,所以,当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。
如果在编程中,1、2两种情形交替出现,这时,你可以考虑使用List这样的通用接口,而不用关心具体的实现,在具体的情形下,它的性能由具体的实现来保证。
4. 配置集合类的初始大小
在Java集合框架中的大部分类的大小是可以随着元素个数的增加而相应的增加的,我们似乎不用关心它的初始大小,但如果我们考虑类的性能问题时,就一定要考虑尽可能地设置好集合对象的初始大小,这将大大提高代码的性能。
比如,Hashtable缺省的初始大小为101,载入因子为0.75,即如果其中的元素个数超过75个,它就必须增加大小并重新组织元素,所以,如果你知道在创建一个新的Hashtable对象时就知道元素的确切数目如为110,那么,就应将其初始大小设为110/0.75=148,这样,就可以避免重新组织内存并增加大小。
ArrayList和Vector类都使用数组方式存储数据,数组元素数大于实际存储的数据数目,以便增加和插入元素。它们都允许直接按序号索引元素,但是插入元素涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。Vector由于使用了synchronized方法(线程安全),通常性能上校ArrayList差。LinkedList使用双向链表是实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时,只需要记录本项的前后项即可,所以插入速度较快。
LinkedList类实现了List接口,允许包含null元素。
注意:LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List,
List list=Collection.synchronizedList(new LinkedList(...))
ArrayList实现了可变大小的数组,它允许包含所有类型的元素,包括null元素。每个ArrayList实例都有一个容量(Capacity),用于存储元素的数组的大小。这个容量可随着不断添加的新的元素而自动增加。当需要插入大量元素时,在插入前可以调用ensureCapacity()方法来增加ArrayList的容量以提高插入效率。非线程安全。
Vector非常类似ArrayList,但是Vector是线程安全的,是同步的。
1. Vector & ArrayList
1) Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
2) 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。
2. Hashtable & HashMap
Hashtable和HashMap它们的性能方面的比较类似 Vector和ArrayList,比如Hashtable的方法是同步的,而HashMap的不是。
3. ArrayList & LinkedList
ArrayList的内部实现是基于内部数组Object[],所以从概念上讲,它更象数组,但LinkedList的内部实现是基于一组连接的记录,所以,它更象一个链表结构,所以,它们在性能上有很大的差别:
从上面的分析可知,在ArrayList的前面或中间插入数据时,你必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以,当你的操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能; 而访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止,所以,当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。
如果在编程中,1、2两种情形交替出现,这时,你可以考虑使用List这样的通用接口,而不用关心具体的实现,在具体的情形下,它的性能由具体的实现来保证。
4. 配置集合类的初始大小
在Java集合框架中的大部分类的大小是可以随着元素个数的增加而相应的增加的,我们似乎不用关心它的初始大小,但如果我们考虑类的性能问题时,就一定要考虑尽可能地设置好集合对象的初始大小,这将大大提高代码的性能。
比如,Hashtable缺省的初始大小为101,载入因子为0.75,即如果其中的元素个数超过75个,它就必须增加大小并重新组织元素,所以,如果你知道在创建一个新的Hashtable对象时就知道元素的确切数目如为110,那么,就应将其初始大小设为110/0.75=148,这样,就可以避免重新组织内存并增加大小。
相关文章推荐
- Android的ListView的每一个Item都有不同的布局
- 笔记
- js、jquery遍历对象
- 南邮 OJ 1102 黑白图像
- vb入门
- QT实现类似QQ截图功能(二):画箭头
- [投稿]谱减法语音降噪原理
- 第13章 Swing程序组件----常用布局管理器
- IOS开发-指纹识别
- ant使用(1)-关于path
- -Dmaven.multiModuleProjectDirectory system propery is not set.
- Android4.2 keyguard源码架构,学习(一)!
- FindBugs插件的安装与使用
- Volley NetworkDispatcher.run: Unhandled exception java.lang.NullPointerException
- web
- javascript运动框架---3--匀速运动
- 南邮 OJ 1101 Trees on the Level
- yii打印sql语句
- [ jQuery] jquery的click(),bind(),on()区别~
- mysql数据库数据迁移方法