1Hashtable继承Dictionary父类,而HashMap继承AbstractMap,两者都是键-值对数据结构
但是Hashtable的键对象必须实现hashcode方法和equals方法
2.Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。
即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;
而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决:
Map Collections.synchronizedMap(Map m)
这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。
3.在HashMap中,只能有一个null键,但可以有多个null值。当get()方法返回null值时,即可以表示HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。
hashtable不允许hull键和hull值
4。由于上述2提到的同步区别,hashtable的访问速度慢于hashmap,因为要进行同步检查,所以非线程环境中使用hashmap性能更好。
5.HashTable使用Enumeration,HashMap使用Iterator。
6.底层实现的不同(一般没用到)
HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数。
本文根据http://www.matrix.org.cn/thread.shtml?topicId=17224&forumId=19整理而来