HashMap是由“数组+链表+红黑树”组成,是线程不安全的,如果需要满足线程安全的话可以使用 ConcurrentHashMap。特别需要注意的是 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。
ConcurrentHashMap是由一个个的 Segment组成的,由于 Segment继承了 ReentrantLock进行加锁,所以ConcurrentHashMap是线程安全的。
HashTable是一个遗留类,其很多映射的常用功能与HashMap类似,不同的是继承自Dictionary类(HashMap继承自AbstractMap),由于其方法被 synchronized进行了修饰,所以HashTable也是线程安全的。
对比总结:
- 不考虑线程安全问题,使用HashMap。
- 考虑线程安全问题,使用ConcurrentHashMap。不推荐使用HashTable,因为并发性不如ConcurrentHashMap。