HashMap 详解一

简介: 本文代码来自JDK8 实现原理 建立一个数组 根据元素哈希值计算数组索引, 保存到数组 索引号相同的元素通过链表保存 链表长度超过范围转红黑树保存 默认常量 初始长度大小: DEFAULT_INITIAL_CAPACITY = 1 << 4, 为了区分容量和元素数目, 这里就用长度表示容量 最大长.

本文代码来自JDK8

实现原理

  1. 建立一个数组
  2. 根据元素哈希值计算数组索引, 保存到数组
  3. 索引号相同的元素通过链表保存
  4. 链表长度超过范围转红黑树保存

默认常量

  • 初始长度大小: DEFAULT_INITIAL_CAPACITY = 1 << 4, 为了区分容量和元素数目, 这里就用长度表示容量
  • 最大长度大小: MAXIMUM_CAPACITY = 1 << 30
  • 默认加载因子: DEFAULT_LOAD_FACTOR = 0.75f
  • 链表转红黑树的阈值: TREEIFY_THRESHOLD = 8
  • 红黑树转链表的阈值: UNTREEIFY_THRESHOLD = 6
  • 转换红黑树要求最小数组长度: MIN_TREEIFY_CAPACITY = 64

变量

  • transient Node[] table: 保存元素的数组
  • transient int size: 元素个数, 不是数组长度
  • int threshold: 对数组扩容的阈值, 容量*加载因子
  • final float loadFactor: 加载因子, 越大填充的数据就越多, 冲突也会越多; 越小填充的数据就越少, 冲突也会减少, 为什么取 0.75 默认值就不深入讨论了

哈希值计算

// key为空, 对应哈希值为 0
// 否则将 key 的哈希值进行扰动: 高 16 位与低 16 位进行异或
// 这样做的原因是当哈希值与数组长度减一进行与运算得出索引时, 
// 对于数组长度比较小的情况, 如果没有扰动, 哈希值的高位将不参与运算, 最后的索引值很有可能会重复
static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

关于 tableSizeFor 方法留到下一 part 再讲.


相关文章
|
2月前
|
存储 安全 Java
HashMap详解
HashMap详解
|
3月前
|
存储 算法 索引
|
3月前
|
Dart 算法 Java
HashMap的0.75可能只是一个经验值
HashMap的0.75可能只是一个经验值
|
存储 算法
详解HashMap
1.hash code hash code是使用hash函数运算得到的一个值,是对象的身份证号码,用于对象的辨重。在同一运行周期,对同一个对象多次调用hashcode(),只要是用于equals()的内容未变,那么每次得到的hash码也应该不变。,但不同运行周期间hash码可能会不同。
95 0
|
存储 缓存 Java
|
存储 算法 安全
【HashMap】
【HashMap】
118 0
|
存储 安全 Oracle
HashMap你真的了解吗?
HashMap你真的了解吗?
103 0
HashMap你真的了解吗?
|
安全 算法 数据挖掘
厉害了!把 HashMap 剖析的只剩渣了!
很高兴遇见你~ HashMap是一个非常重要的集合,日常使用也非常的频繁,同时也是面试重点。本文并不打算讲解基础的使用api,而是深入HashM
厉害了!把 HashMap 剖析的只剩渣了!
|
存储
HashMap 中的一个“坑”!(2)
HashMap 中的一个“坑”!(2)
199 0
HashMap 中的一个“坑”!(2)
HashMap 中的一个“坑”!(1)
HashMap 中的一个“坑”!(1)
166 0
HashMap 中的一个“坑”!(1)