hashmap和hashtable的区别

Z, ZLW 2296

hashmap和hashtable的区别有:1、哈希计算方法不同;2、键值是否可以为空值;3、实现方式不同;4、初始化容量不同;5、扩容机制不同;6、支持的遍历种类不同;7、迭代器不同;8、添加key-value的hash值算法不同;9、部分API不同;10、同步性不同;11、性能不同。哈希计算方法不同是指hashmap在取模之前进行二次hash。

1、哈希计算方法不同

hashmap:HashMap计算hash对key的hashcode进行了二次hash,以获得更好的散列值,然后对table数组长度取模。

hashtable:Hashtable计算hash是直接使用key的hashcode对table数组的长度直接进行取模。

2、键值是否可以为空值

hashmap:HashMap可以使用null作为key,不过建议还是尽量避免这样使用。HashMap以null作为key时,总是存储在table数组的名列前茅个节点上。

hashtable:Hashtable则不允许null作为key

3、实现方式不同

hashmap: HashMap 继承的是 AbstractMap 类。

hashtable:Hashtable 继承的是 Dictionary类。

4、初始化容量不同

hashmap:HashMap 的初始容量为:16。

hashtable:Hashtable 初始容量为:11。

两者的负载因子默认都是:0.75

5、扩容机制不同

hashmap:已用容量>总容量 * 负载因子时,HashMap 扩容规则为当前容量翻倍。

hashtable:已用容量>总容量 * 负载因子时,Hashtable 扩容规则为当前容量翻倍 +1。

6、支持的遍历种类不同

hashmap:HashMap只支持Iterator遍历。

hashtable:HashTable支持Iterator和Enumeration两种方式遍历。

7、迭代器不同

hashmap:HashMap的迭代器(Iterator)是fail-fast迭代器,所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。而Hashtable 则不会。

hashtable:Hashtable的enumerator迭代器不是fail-fast的。

8、添加key-value的hash值算法不同

hashmap:HashMap添加元素时,是使用自定义的哈希算法。

hashtable:添加元素时,HashTable是直接采用key的hashCode()。

9、部分API不同

hashmap:HashMap不支持contains(Object value)方法,没有重写toString()方法。

hashtable:HashTable支持contains(Object value)方法,而且重写了toString()方法。

10、同步性不同

hashmap:HashMap是一个不同步的Map,这意味着HashMap不是线程安全的,如果没有适当的同步代码,则无法在多个线程之间共享。

hashtable:Hashtable是一个同步的Map,Hashtable是线程安全的,可以在多个线程之间共享。如果您需要使用同步的 Map,Hashtable 比在同步包装器中使用 HashMap 更快。

11、性能不同

由于HashMap不是同步的Map,因此在性能方面它比Hashtable更快,更好,实际上,它比Hashtable使用更少的内存。虽然它们实际上是相同的,但Hashtable比HashMap慢一点,但比同步的HashMap快一点。从本质上讲,将 Hashtable 与多线程访问结合使用是不安全的,因为只有方法是同步的。Hashtable是HashMap的同步对应物。与同步对象相比,非同步对象的性能更好,就像 Hashtable 在单线程环境中的性能更好一样。

回复

我来回复
  • 暂无回复内容

站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部