A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 鄢甲力 黑马帝   /  2011-7-31 14:28  /  2622 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

求助ArrayList,Vector, LinkedList的存储性能和特性

3 个回复

倒序浏览
黑马网友  发表于 2011-7-31 15:43:02
沙发
arraylist ,vector 都是通过数组的方式存储数据,数组大小可变,允许所有的为null,但是arraylist 没有同步的方法,必须自己实现外部的同步方法,但是vector有同步的方法,所以不要自己实现同步的方法。
而linkedlist使用的是双向链表的方式,按照序号索引元素,需要向前和向后遍历,但是插入只有遍历前后项就行了,所以插入数据较快。
回复 使用道具 举报
黑马网友  发表于 2011-7-31 16:06:15
藤椅
ArrayList,LinkedList,Vestor这三个类都实现了java.util.List接口,但它们有各自不同的特性,主要如下:

一、同步性

ArrayList,LinkedList是不同步的,而Vestor是的。所以如果要求线程安全的话,可以使用ArrayList或LinkedList,可以节省为同步而耗费开销。但在多线程的情况下,有时候就不得不使用Vector了。当然,也可以通过一些办法包装ArrayList,LinkedList,使他们也达到同步,但效率可能会有所降低。

二、数据增长
从内部实现机制来讲ArrayList和Vector都是使用Objec的数组形式来存储的。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。

三、检索、插入、删除对象的效率

ArrayList和Vector中,从指定的位置(用index)检索一个对象,或在集合的末尾插入、删除一个对象的时间是一样的,可表示为O(1)。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行(n-i)个对象的位移操作。
LinkedList中,在插入、删除集合中任何位置的元素所花费的时间都是一样的—O(1),但它在索引一个元素的时候比较慢,为O(i),其中i是索引的位置。

所以,如果只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是对其它指定位置的插入、删除操作,最好选择LinkedList

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-31 16:13:45
板凳

回复 藤椅 的帖子

多谢,收获很多!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马