ArrayList和Vector的区别,HashMap和Hashtable的区别

14年前

ArrayList和HashMap是异步的,Vector和HashTable是同步的,所以Vector和HashTable是线程安全的,而ArrayList和HashMap并不是线程安全的。因为同步需要花费机器时间,所以Vector和HashTable的执行效率要低于ArrayList和HashMap。
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap

List接口
  List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于java的数组。
和下面要提到的Set不同,List允许有相同的元素。
  除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。
  实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。
ArrayList类
  ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。
size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。
  每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。
  和LinkedList一样,ArrayList也是非同步的(unsynchronized)。
Map接口
  请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。
HashMap类
  HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。

----------------------------------------------3楼----------------------------------------------------------

1.
List是接口,List特性就是有序,会确保以一定的顺序保存元素.
ArrayList是它的实现类,是一个用数组实现的List.
Map是接口,Map特性就是根据一个对象查找对象.
HashMap是它的实现类,HashMap用hash表实现的Map,就是利用对象的hashcode(hashcode()是Object的方法)进行快速散列查找.(关于散列查找,可以参看<<数据结构>>)
2.
一般情况下,如果没有必要,推荐代码只同List,Map接口打交道.
比如:List list = new ArrayList();
这样做的原因是list就相当于是一个泛型的实现,如果想改变list的类型,只需要:
List list = new LinkedList();//LinkedList也是List的实现类,也是ArrayList的兄弟类
这样,就不需要修改其它代码,这就是接口编程的优雅之处.
另外的例子就是,在类的方法中,如下声明:
private void doMyAction(List list){}
这样这个方法能处理所有实现了List接口的类,一定程度上实现了泛型函数.
3.
如果开发的时候觉得ArrayList,HashMap的性能不能满足你的需要,可以通过实现List,Map(或者Collection)来定制你的自定义类.
可以参考The Art Of Computer Programming的Sorting and Searching部分

下面的三个函数都是相等的..返回的都是new ArrayList()

public Collection getDomainsHelper(String sql)
{
Collection list=new ArrayList();
return list;
}


public Collection getDomainsHelper(String sql)
{
List list=new ArrayList();
return list;
}


public Collection getDomainsHelper(String sql)
{
return new ArrayList();
}

Collection是List和Set两个接口的基接口
List在Collection之上增加了"有序"
Set在Collection之上增加了"唯一"

而ArrayList是实现List的类...所以他是有序的.
它里边存放的元素在排列上存在一定的先后顺序

而且ArrayList是采用数组存放元素
另一种List LinkedList采用的则是链表

Vector 还是ArrayList——哪一个更好,为什么?

要回答这个问题不能一概而论,有时候使用Vector比较好;有时是ArrayList,有时候这两个都不是

最好的选择。你别指望能够获得一个简单肯定答案,因为这要看你用它们干什么。下面有4个要考虑

的因素:


l API


l 同步处理


l 数据增长性


l 使用模式


下面针对这4个方面进行一一探讨


API


在由Ken Arnold等编著的《java Programming Language》(Addison-Wesley, June 2000)一书中有这

样的描述,Vector类似于ArrayList.。所有从API的角度来看这两个类非常相
似。但他们之间也还

是有一些主要的区别的。

同步性


Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步

的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不

需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的

性能开销。


数据增长


从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类

型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,

Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集

合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一

些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。


使用模式


在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一

个元素所花费的时间是一样的,这个时间我们用O(1)表示。但是,如果在集合的其他位置增加或移除

元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元

素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素

都要执行位移的操作。这一切意味着什么呢?


这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或

ArrayList都可以。如果是其他操作,你最好选择其他的集合操作类。比如,LinkList集合类在增加

或移除集合中任何位置的元素所花费的时间都是一样的?O(1),但它在索引一个元素的使用缺比较慢

-O(i),其中i是索引的位置.使用ArrayList也很容易,因为你可以简单的使用索引来代替创建

iterator对象的操作。LinkList也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开