思维导图

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