{ HashMap }

  • HashMap 源码分析

    |

    特征

    • 根据键的 hascode 值存储数据,可直接定位值,具有很快的数据访问数组
    • 遍历的顺序不确定
    • 最多允许一条 null 键,允许多条记录的键为 null
    • 非线程安全
      可使用 Collections.synchronizedMap 使 HashMap 具有线程安全的能力 或 ConcurrentHashMap

    底层结构

    底层结构采用了数组,而数组的每一个元素都是多个 Node 构成的链表,当数组超过 threshold 时,数组将会扩容。

    数组中的每一个都相当于一个单向链表,key 通过 hash() 后,相同的键值对会加入到链表中,当桶中的数过多时(链表长度 > 8),将会转化为 红黑树,相比与Jdk 1.7, Jdk 1.8 中当链表过长时,链表转化为红黑树,在维护红黑树时,最坏情况下查找的时间复杂度为 O(log n),比起单链表的 O(1) ~ O(n), 时间复杂度降低了,但所需要维护的空间占用却更多。