Java面试题

题目

你了解 HashMap 吗?请讲讲 hashMap 的数据结构。ConcurrentHashMap 呢?

答案

HashMap

JDK 1.8 之后 HashMap 的数据结构由 数组 + 链表 + 红黑树 组成。它不是线程安全的。它拥有一个 table 数组。每个数组的位置上面存放对应的 key 的 hash 值的节点(Node)信息。HashMap 中 key 是可以为 null 的,但是只能够有一个值。当 key 的 hash 值相同的时候,就可以将其当做链表往后追加,当 key 的 Hash 值相同值超过 8 个的时候,就将链表转换成红黑数。

HashMap 中默认的长度是 16。加载因子是 0.75。当 HashMap 中的存储节点数量超过 16 * 0.75 的时候就会扩容,扩容会扩展成之前的两倍。

ConcurrentHashMap

ConcurrentHashMap 效率比 HashMap 效率低,但是它是线程安全的。它的数据结构和 HashMap 的数据结构一样,也是通过 数组 + 链表 + 红黑树 组成。它不允许 key 和 value 是 null 的情况。在添加一个元素的时候,它会先判断当前的对象是不是空的。如果是空的,就初始化当前的 table 数组,然后调用 CAS 判断逻辑,将数值添加到数组中的第一个位置。如果有 hash 冲突,则使用 synchronized 对当前的链表或者红黑树进行加锁。因为它只会针对对应的 hash 值的链表进行加锁,所以只会影响当前与 key 的 hash 值相等的节点,不会影响其它节点,比全部节点加锁效率高。