1、HashMap和HashTable有什么区别?
① HashMap是线程不安全的,HashTable是线程安全的;
② 因为线程安全,所以HashTable的效率比不上HashMap;
③ HashMap最多只允许一条记录的键为null,允许多条记录的值为null;而HashTable不允许;
④ HashMap默认初始化数组的大小为16,HashTable为11,前者扩容时,扩大两倍,后者扩大两倍+1;
⑤ HashMap需要重新计算hash值,而HashTable直接使用对象的hashcode。
2、Java中另一个线程安全的与HashMap极其类似的类是什么?同样是线程安全,ta与HashTable在线程同步上有什么不同?
① ConcurrentHashMap 类(是Java并发包java.util.concurrent中提供的一个线程安全且高效的HashMap实现); ConcurrentHashMap 在 JDK1.7中采用分段锁的方式, JDK1.8中直接采用了CAS(无锁算法)+ synchronized,也采用分段锁的方式并大大缩小了锁的粒度。
② HashTable是使用synchronize 关键字加锁的原理(对象锁);
3、HashMap 与 ConcurrentHashMap的区别
① 除了加锁,原理无太大区别
HashMap的键值对 允许有null,但是ConcurrentHashMap都不允许。
4、为什么ConcurrentHashMap 比 HashTable 效率要高?
① HashTable使用一把锁(锁住整个链表结构)处理并发问题,多个线程竞争一把锁,容易阻塞;
② ConcurrentHashMap: JDK1.7中使用分段锁(ReentrantLock+Segment+HashEntry),相当于把一个HashMap分成多个段,每段分配一把锁,这样支持多线程访问。锁粒度:基于Segment,包含多个HashEntry。
JDK1.8 中使用CAS + synchronized + Node + 红黑树,锁粒度:Node(首节点)(实现Map。Entry<K,V>),锁粒度降低了。