思维导图
- hashmap
- 1.定义特征
- 键值对数据结构
- 键可为NULL
- 散列表
- 线程不安全
- 无序
- 2.类型关系
- 继承树
- HashTable
- TreeMap
- LinkedHashMap
- 3.内部实现
- 存储:数据结构
- JDK7:数组+链表
- JDK8:数组+链表+红黑树
- 属性
- 容量
- 默认:16
- 上限:初始化不超过1«30
- 为什么不是1«31
- 扩容因子
- 默认0.75,大于0
- 0.75的原因
- 扩容时机:元素数量超过阈值
- 默认0.75,大于0
- 阈值(容量*扩容因子)
- 默认:12,
- 上限:Integer.MAX_VALUE
- 转树的阈值
- 设置为8
- 原因:概率小
- 设置为8
- 容量
- 寻址:基于hash算法
- 键的hash值高低16位异或
- 哈希冲突:链地址法
- 存储:数据结构
- 4.属性
- 5.方法
- 构造方法
- 无参构造
- 容量构造
- 容量+扩容因子构造
- map构造
- 重要方法
- 出
- get
- getOrDefault
- remove
- 入
- put
- putAll
- putIfAbsent
- 其他
- compute
- 计算然后返回最后结果(新值|null),可插入|更新|删除
- computeIfAbsent
- 如果没有则计算(返回原值|新值|null),可插入
- computeIfPresent
- 如果已有则计算(返回新值|null),可更新|删除
- merge
- replace
- replaceAll
- compute
- 出
- 构造方法
- 6.核心
- 扩容
- 方法
- tableSizeFor:初始化阈值大小,作为hashmap第一次初始化扩容时的容量
- resize:扩容函数
- 时机
- 第一次put元素初始化
- 元素数量达到阈值
- 方式
- 默认初始容量为16,之后容量=容量*2,最大1«30
- 阈值=阈值*2
- 迁移元素
- 方法
- 链表转树
- 哈希冲突链表长度超过8时
- 扩容
- 1.定义特征