HashMap和HashTable的区别:
- HashMap是非线程安全的,HashTable是线程安全的。
- HashMap的键和值都允许有null值存在,而HashTable则不行。
- HashMap线程不安全,HashTable线程安全,但是因为线程安全的原因,HashMap效率更高。
- HashTable是同步的,HashMap不是。因此,HashMap更适合于单线程环境,而HashTable适合于多线程环境,一般现在是不建议使用HashTable,
- ①是因为HashTable是遗留类,内部实现很多没有优化,并且冗余。
- ②即使在多线程环境下,现在也有同步的ConcurrentHashMap替代。
HashTable和ConcurrentHashMap区别:
HashTable使用的是Synchronized关键字修饰,ConcurrentHashMap是JDK1.7使用了锁分段技术来保证线程安全的。JDK1.8ConcurrentHashMap取消了Segment分段锁,采用CAS和synchronized来保证并发安全。
ConcurrentHashMap底层是数组+链表/红黑树
HashTable底层是数组加链表
ConcurrentHashMap中的synchronized只锁定当前链表或红黑树的首节点,只要hash不冲突,就不会产生并发,效率有提示N倍
为什么ConcurrentHashMap优于HashTable?
- ConcurrentHashMap 在JDK1.8以后采用的是CAS 乐观锁和synchronized悲观锁,而HashTable采用的是Synchronize悲观锁。其中ConcurrentHashMap的synchronized
- 乐观锁的范围小于悲观锁,尤其是读多写少的场景下,并发性能优于悲观锁。