其实我们可以理解ConcurrentHashMap是HashMap的升级版,熟悉HashMap都知道其性能已经很拉菲了,但HashMap因不是线程安全的带来了高并发问题,因此就有了ConcurrentHashMap。
死循环是因为并发 HashMap 扩容导致的,并发扩容的第一步,线程 T1 和线程 T2 要对 HashMap 进行扩容操作,假设两个线程的指针, T1 和 T2 指向的是链表的头结点元素 A,而 T1 和 T2 的下一个节点,也就是 T1.next 和 T2.next 指向的是 B 节点。
前面我们讲了链表这种数据结构,相比于数组的好处是对元素在增删场景效率特别高,弥补了数组新增和删除效率极低的缺陷。同样链表也存在自己致命的缺陷,那就是查询和修改效率太低。其实数组和链表这两种数据结构刚好是互补的,只是前者的优点是后者的缺点,而后者的优点是前者的缺点。
HashMap是面试中经常问到的一个知识点,也是判断一个候选人基础是否扎实的标准之一,因为通过HashMap可以引出很多知识点,比如数据结构、equals和hashcode方法,除此之外还可以引出线程安全的问题,HashMap是我在初学阶段学到的设计的最为巧妙的集合,里面有很多细节以及优化技巧都值得我们深入学习,本文将会涉及到以下问题:默认大小、负载因子以及扩容倍数。