HashMap和HashTable的区别?
请对比Java中HashMap和HashTable的区别,包括线程安全性、null处理、初始容量和扩容、迭代器、性能以及历史地位。为什么HashTable已被弃用?
回答
我是大山
| 区别 | HashMap | HashTable |
|---|---|---|
| 线程安全 | 不安全 | 安全(synchronized) |
| null键/值 | 允许一个null键和多个null值 | 不允许null键/值(NPE) |
| 初始容量 | 16 | 11 |
| 扩容 | 2倍 | 2倍+1(old*2+1) |
| 迭代器 | fail-fast迭代器 | fail-fast迭代器+Enumeration |
| 性能 | 高 | 低(方法级同步) |
| 引入版本 | Java 2(1.2) | Java 1.0(遗留类) |
为什么HashTable被弃用:
- 方法级synchronized粒度太粗,并发性能差
- 不允许null限制了使用
- 有更优的替代方案:ConcurrentHashMap(线程安全+高性能)、Collections.synchronizedMap()
总结:单线程用HashMap;多线程用ConcurrentHashMap;不要在新代码中使用HashTable。