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), 时间复杂度降低了,但所需要维护的空间占用却更多。