第一、继承不同
第一个区别主要是历史原因。 Hashtable基于旧的Dictionary类,HashMap是Java 1.2引入的Map接口的实现。
public class HashMapK,V extends AbstractMapK,V implements Cloneable,serializable { . } publicclasshashtablek,vextendsdiction Cloneable,Serializable {.}和HashMap继承的抽象类AbstractMap实现了Map接口:
publicabstractclassabstractmapk,V implements MapK,V {.}
第二、线程安全不一样
Hashtable方法是同步的,但HashMap方法缺省情况下是异步的。 在多线程并发环境中,可以直接使用Hashtable,但要使用HashMap,必须自己添加同步过程。
//这是Hashtable的put (方法:/* * * associatethespecifiedvaluewiththespecifiedkeyinthis (@ code hashtable ).ifthekeyalrred thekeyandvaluecannotbenull.* * @ param key * thekeytoadd.* @ param value * the value toadd.* @ returntheoldvalueasssociatedwiated or { @ code null } * ifthekeydidnotexist.* @ see # elements * @ see # keys * @ see Java.lang.object # equals }elseif(value==null ) thrownewnullpointerexception (' value==null ' ); } int hash=collections.secondary hash (key ); HashtableEntryK,V[] tab=table; intindex=hash(tab.Length-1; HashtableEntryK,V first=tab[index]; for(hashtableentryk,V e=first; e!=空; e=e.next(if ) e.hash==hashkey.equals ) e.key ) ) { V oldValue=e.value; e.value=value; return oldValue; }//这是HashMap的put ()方法:/* * mapsthespecifiedkeytothespecifiedvalue.* * @ param key * the key.* @ param value * the @ returnthevalueofanypreviousmappingwiththespecifiedkeyor * { @ code null } iftherewasnosuchmapping.*/@ overrridepublicvicvelicvicvicving } int hash=collections.secondary hash (key ); HashMapEntryK,V[] tab=table; intindex=hash(tab.Length-1; for(hashmapentryk,V e=tab[index] ); e!=空; e=e.next(if ) e.hash==hashkey.equals ) e.key ) ) premodify ) e ); V oldValue=e.value; e.value=value; return oldValue; }从上面的源代码中可以看到,Hashtable的put (方法是同步的,而HashMap的put )方法不是。
第三、允不允许null值
上面的put ) )方法的源代码中可以看到,在Hashtable中,key和value都为不允许出现null值,否则抛出NullPointerException异常。
另一方面,在HashMap上,只有一个键,例如null可以作为键, 与一个或多个键对应的值为空。 get ) )方法返回空值时,可以指示HashMap没有键,也可以指示与键对应的值为空。 因此,在HashMap中,应该使用containsKey ) )方法来确定某个键是否位于HashMap中,而不是使用get () )方法来确定。
第四、遍历方式的内部实现上不同
Hashtable、HashMap都使用了迭代器。 由于历史原因,Hashtable还使用了枚举方式。
第五、哈希值的使用不同
HashTable直接使用对象的hashCode。 HashMap重新计算hash值。
第六、内部实现方式的数组的初始大小和扩容的方式不一样
HashTable的hash数组的初始大小为11,增加方式为old*2 1。 HashMap散列数组的默认大小为16,并且始终为2的指数。
【总结】:
HashMap
线程不安全
允许为空的键和值
效率稍微好一点,
方法不是提供同步外部同步
有containsvalue和containsKey的方法
HashMap是Java1.2导入的map界面的安装
HashMap是Hashtable的轻量级实现
可擦可擦
线程安全
不能使用空键和值
有点低效率,
方法是同步化的
有contains方法
Hashtable被Dictionary类继承
Hashtable比HashMap旧
【建议】:
有些资料建议在需要同步时使用Hashtable,相反使用HashMap。 但是,由于可以根据需要同步HashMap,所以HashMap的功能比Hashtable的功能多,而且不是基于旧的类,所以人们普遍认为HashMap优先于Hashtable
【参考资料】:
1、Hashtable、HashMap源代码2、Java的HashMap与HashTable3、HashMap与Hashtable的区别