HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。可能你觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别。 
1.HashTable的方法是同步的,HashMap未经同步,所以在多线程场合要手动同步HashMap这个区别就像Vector和ArrayList一样。2.HashTable不允许null值(key和value都不可以),HashMap允许null值(key和value都可以)。3.HashTable有一个contains(Object value),功能和containsValue(Object value)功能一样。4.HashTable使用Enumeration,HashMap使用Iterator。以上只是表面的不同,它们的实现也有很大的不同。5.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。6.哈希值的使用不同,HashTable直接使用对象的hashCode,代码是这样的:
int hash = key.hashCode();
int index = (hash & 0x7FFFFFFF) % tab.length;
而HashMap重新计算hash值,而且用与代替求模:
int hash = hash(k);
int i = indexFor(hash, table.length);static int hash(Object x) {
  int h = x.hashCode();  h += ~(h << 9);
  h ^= (h >>> 14);
  h += (h << 4);
  h ^= (h >>> 10);
  return h;
}
static int indexFor(int h, int length) {
  return h & (length-1);
}
以上只是一些比较突出的区别,当然他们的实现上还是有很多不同的,比如
HashMap对null的操作 
网上找的哈哈~~~

解决方案 »

  1.   

    在并发操作上,hashtable使用同步机制,实际应用程序中,仅仅是Hashtable本身的同步并不能保证程序在并发操作下的正确性,需要高层次的并发保护。下面的代码试图在key所对应的value值等于x的情况下修改value为x+1value = hashTable.get(key);   
    if(value.intValue()== x)
      {hashTable.put(key,new Integer(value.intValue()+1));}}如2个线程同时执行以上代码,可能放入不是x+1,而是x+2.而hashmap没有同步机制.需要使用者自己进行并发访问控制.在遍历上,hashtable支持Iterator 和 Enumeration,而hashmap只支持Iteratorhashtable不支持null的key或value   而hashmap支持
      

  2.   

    通俗的讲 hashtable 线程安全 但效率低  
             hashmap  非线程安全 但效率高
      

  3.   

    如果hashmap具有无可区敌的优势,那么,hashtable可以退出历史舞台了。为什么它还继续存在呢?
      

  4.   

     你说对了,现在 都 不建议 使用 hashtable和 vector了 
      

  5.   

    你不用它不就可以了?要在 JDK 中删除这个类那是绝对不可能的!
      

  6.   

    那在旧的JDK标准下写的程序怎么办?
      

  7.   

    Hashtable和HashMap类有三个重要的不同之处。第一个不同主要是历史原因。Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现。也许最重要的不同是Hashtable的方法是同步的(线程安全),而HashMap的方法(非线程安全)不是。这就意味着,虽然你可以不用采取任何特殊的行为就可以在一个多线程的应用程序中用一个Hashtable,但你必须同样地为一个HashMap提供外同步。一个方便的方法就是利用Collections类的静态的synchronizedMap()方法,它创建一个线程安全的Map对象,并把它作为一个封装的对象来返回。这个对象的方法可以让你同步访问潜在的HashMap。这么做的结果就是当你不需要同步时,你不能切断Hashtable中的同步(比如在一个单线程的应用程序中),而且同步增加了很多处理费用。第三点不同是,只有HashMap可以让你将空值作为一个表的条目的key或value。HashMap中只有一条记录可以是一个空的key,但任意数量的条目可以是空的value。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么get()将返回null。如果有必要,用containKey()方法来区别这两种情况。一些资料建议,当需要同步时,用Hashtable,反之用HashMap。但是,因为在需要时,HashMap可以被同步,HashMap的功能比Hashtable的功能更多,而且它不是基于一个陈旧的类的,所以有人认为,在各种情况下,HashMap都优先于Hashtable。
      

  8.   

    如果用jdk1.4之前的用hashtable,反之hashmap