a.
Hashtable
是继承自陈旧的
Dictionary
类的,
HashMap
继承自
AbstractMap
类同时是
Java 1.2
引进的
Map
接口的一个实现。
b.
也许最重要的不同是
Hashtable
的方法是同步的,而
HashMap
的方法不是。这就意味着,虽然你可以不用采取任何特殊的行为就可以在一个
多线程的应用程序中用一个
Hashtable
,但你必须同样地为一个
HashMap
提供外同步。一个方便的方法就是利用
Collections
类的静态的
synchronizedMap()
方法,它创建一个线程安全的
Map
对象,并把它作为一个封装的对象来返回。这个对象的方法可以让你同步访问潜在的
HashMap
。这么做的结果就是当你不需要同步时,你不能切断
Hashtable
中的同步(比如在一个单线程的应用程序中),而且同步增加了很多处理费用。
c.
第三点不同是,只有
HashMap
可以让你将空值作为一个表的条目的
key
或
value
。
HashMap
中只有一条记录可以是一个空的
key
,但任意数量的条目可以是空的
value
。这就是说,如果在表中没有发现搜索键,或者如果发现了搜索键,但它是一个空的值,那么
get()
将返回
null
。如果有必要,用
containKey()
方法来区别这两种情况。
d.
HashMap
去掉了
Hashtable
的
contains
方法,保留了
containsValuecontainsKey
方法
e.
Hashtable
中
hash
数组默认大小是
11
,增加的方式是
old*2+1
。
HashMap
中
hash
数组的默认大小是
16
,而且一定是
2
的指数