为什么hashtable比hashmap低效
时间: 2023-11-08 14:01:33 浏览: 97
HashTable相比于HashMap在性能上较低效的原因有几个方面。首先,HashTable继承自Dictionary类,而HashMap则是基于数组、链表和红黑树实现的。由于HashTable需要保持线程安全,所以在任意时间只能有一个线程能够写入HashTable,这导致了锁的粒度较粗,而ConcurrentHashMap引入了分段锁,可以并发地操作不同的段,从而提高了并发性能。
其次,HashTable不支持null键和值,而HashMap可以支持null键和值。这是因为HashTable使用了和HashMap不同的哈希定位方法,导致null键和值无法正常处理。
另外,HashTable使用了较为简单和低效的哈希定位方法。在get操作中,HashTable先进行一次再哈希,然后使用哈希值通过哈希运算定位到segment,再通过哈希算法定位到元素。这种定位方法相对于HashMap的定位方式效率较低。
最后,在多线程环境下,HashTable的性能更低。由于HashTable是线程安全的,所以在并发情况下,只能有一个线程进行写入操作,其他线程需要等待锁的释放。而HashMap采用了分段锁的机制,允许多个线程同时进行读操作,提高了并发性能。
综上所述,以上是HashTable比HashMap低效的几个原因。
相关问题
Hashtable 与 HashMap 区别
Hashtable 和 HashMap 都是实现了 Map 接口的类,它们的主要区别如下:
1. 线程安全性:Hashtable 是线程安全的,而 HashMap 不是线程安全的。
2. null 键和 null 值:Hashtable 不允许 null 键和 null 值,而 HashMap 允许 null 键和 null 值。
3. 底层实现:Hashtable 是基于 Dictionary 类实现的,而 HashMap 是基于 AbstractMap 类实现的。
4. 迭代器:Hashtable 的迭代器是通过 Enumeration 实现的,而 HashMap 的迭代器是通过 Iterator 实现的。
5. 初始容量和扩容机制:Hashtable 的默认初始容量为 11,负载因子为 0.75;HashMap 的默认初始容量为 16,负载因子为 0.75。当 Hashtable 或 HashMap 中元素的数量超过容量 * 负载因子时,就需要进行扩容。Hashtable 扩容时将容量翻倍加 1,而 HashMap 扩容时只是简单地将容量翻倍。
综上所述,如果需要线程安全性并且不需要允许 null 键和 null 值,则可以选择使用 Hashtable;如果不需要线程安全性或者需要允许 null 键和 null 值,则可以选择使用 HashMap。
hashtable和hashmap
Hashtable和HashMap都是基于哈希表实现的Map接口的实现类,但是它们采用的哈希算法和数据结构有所不同。Hashtable是线程安全的,而HashMap不是。Hashtable使用synchronized关键字来保证线程安全,而HashMap则不使用。由于HashMap采用链表和红黑树的数据结构,可以更好地处理哈希冲突,因此HashMap的查找、插入和删除操作都是常数时间O(1),它的性能相对于Hashtable更高。因此,在单线程环境下,建议使用HashMap,而在多线程环境下,建议使用Hashtable或者ConcurrentHashMap。
阅读全文