在平时的工作或面试中,经常需要考虑容器的选择问题,其中“map和hash_map的差异点”出现的概率最高。那么,我们从底层原理上看看具体都有哪些区别和联系。目录为了方便大家阅读文章,我们先介绍一下文章结构,大家可以直接跳到感兴趣的位置进行阅读。
其实我们可以理解ConcurrentHashMap是HashMap的升级版,熟悉HashMap都知道其性能已经很拉菲了,但HashMap因不是线程安全的带来了高并发问题,因此就有了ConcurrentHashMap。
Java7中HashMap的实现就是一个数组,然后数组中的每一个元素又是一个链表,这个链表的存在是为了解决哈希冲突导致的问题,就是一个元素经过哈希计算后得到元素的存储位置,但是这个位置已经有其它元素占领,也就是占领元素和新插入元素都在这个数组中的同一个位置,此时就用链表进行维护这个存储位置。
HashMap 死循环发生在 JDK 1.7 版本中,形成死循环的原因是 HashMap 在 JDK 1.7 使用的是头插法,头插法 + 链表 + 多线程并发 + HashMap 扩容,这几个点加在一起就形成了 HashMap 的死循环,解决死锁可以采用线程安全容器 ConcurrentHashMap 替代。
HashMap是面试中经常问到的一个知识点,也是判断一个候选人基础是否扎实的标准之一,因为通过HashMap可以引出很多知识点,比如数据结构、equals和hashcode方法,除此之外还可以引出线程安全的问题,HashMap是我在初学阶段学到的设计的最为巧妙的集合,里面有很多细节以及优化技巧都值得我们深入学习,本文将会涉及到以下问题:默认大小、负载因子以及扩容倍数。