【转】ArrayList LinkedList Vector 的关系和区别_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > 【转】ArrayList LinkedList Vector 的关系和区别

【转】ArrayList LinkedList Vector 的关系和区别

 2011/12/8 8:10:53  foohsinglong  http://foohsinglong.iteye.com  我要评论(0)
  • 摘要:ArrayList,LinkedList,Vector这三个类都实现了java.util.List接口,但它们有各自不同的特性,主要如下:引用1.ArrayList底层是采用数组实现的(并且该数组的类型是Object类型的)2.如果是JDK6.0的话,采用Array.of()方法来生成一个新的数组,如果是JDK5.0的话,使用的是System.arraycopy方法(将数组拷贝)3.Listlist=newArrayList();时,底层会生成一个长度为10的数组来存放对象
  • 标签:list 关系 区别 CTO
ArrayList,LinkedList,Vector这三个类都实现了java.util.List接口,但它们有各自不同的特性,主要如下:
引用1. ArrayList底层是采用数组实现的(并且该数组的类型是Object类型的)

2. 如果是JDK 6.0的话,采用Array.of()方法来生成一个新的数组,如果是JDK 5.0的话,使用的是System.arraycopy方法(将数组拷贝)

3. List list = new ArrayList();时,底层会生成一个长度为10的数组来存放对象,如果预先知道List会存放多少个对象的话,最好通过new ArrayList(int length)的方式先确定数组的最小长度,如new ArrayList(50),这样能提高底层的效率。

4. 对于ArrayList与Vector来说,底层都是采用数组方式来实现的(该数组是一个Object类型的数组)

5. 对于ArrayList,所有方法都不是同步的,对于Vector,大部分是public的方法都是同步的。

6. LinkedList底层是由双向循环链表实现的,对于ArrayList,查找速度非常快,增加和caozuo.html" target="_blank">删除操作非常慢。(本质上是由数组的特点来决定的)

7. 对于LinkList,查找速度非常慢,增加和删除操作非常快。(本质上是由双向循环链表的特点来决定的)

引用一、同步性
ArrayList,LinkedList是不同步的,而Vector是的。所以如果要求线程安全的话,可以使用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
配置集合类的初始大小
   在Java集合框架中的大部分类的大小是可以随着元素个数的增加而相应的增加的,我们似乎不用关心它的初始大小,但如果我们考虑类的性能问题时,就一定要考虑尽可能地设置好集合对象的初始大小,这将大大提高代码的性能。
   比如,Hashtable缺省的初始大小为101,载入因子为0.75,即如果其中的元素个数超过75个,它就必须增加大小并重新组织元素,所以,如果你知道在创建一个新的Hashtable对象时就知道元素的确切数目如为110,那么,就应将其初始大小设为110/0.75=148,这样,就可以避免重新组织内存并增加大小。
发表评论
用户名: 匿名