黑马程序员技术交流社区

标题: ArrayList,Vector, LinkedList 的问题? [打印本页]

作者: 袁世宇    时间: 2011-11-22 13:20
标题: ArrayList,Vector, LinkedList 的问题?
ArrayList,Vector, LinkedList 的存储性能和特性?
作者: 申绪胜    时间: 2011-11-22 13:49
ArrayList看前面的名字就知道,这个底层是数组结构的,按编号存储,允许有重复的

Vector,是一个特殊的ArrayList,是一个线程安全的ArrayList

LinkedList,底层的存储结构是链表
作者: 崔浩    时间: 2011-11-22 14:31
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
作者: 冯敏    时间: 2011-11-22 15:54
ArrayList代表一个数组 数据存储在一片连续的空间。 数据量小时使用此类,当然查询效率比较高。
LinkedList是代表链表 数据分散存储在内存中的各个角落。 数据量稍大时使用此类。
Vector类和ArrayList类是十分相似的,在定义类集的时候Vector类多实现了一个List接口,所以此类可以直接为List接口实例化。

作者: 程立彬    时间: 2011-11-23 09:05
ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢,Vector由于使用了synchronized方法(线程安全)所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项的前后项即可,所以插入数度较快!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2