哈希表 / 散列表

2021-10-08  本文已影响0人  张_何

哈希表

哈希冲突

JDK1.8 中的哈希冲突解决方案

哈希函数

如何生成 key 的哈希值

整数的哈希值
- [ ] 整数值当做哈希值, 比如 10 的哈希值就是 10
浮点数的哈希值
- [ ] 将存储的二进制格式转为整数值
Long 和 Double 的哈希值
public static int hashCode(long value) {
  return (int)(value ^ (value >>> 32));
} 
public static int hashCode(double value) {
  long bits = doubleToLongBits(value);
  return (int)(value ^ (value >>> 32));
} 

这里使用 >>> (右移) 和 ^ (异或) 的作用是:
1.高 32bit 和低 32bit 混合计算出 32bit 的哈希值
2.充分利用所有信息计算出哈希值

value 1111 1111 1111 1111 1111 1111 1111 1111 1011 0110 0011 1001 0110 1111 1100 1010
value >>> 32 0000 0000 0000 0000 0000 0000 0000 0000 1111 1111 1111 1111 1111 1111 1111 1111
value ^ (value >>> 32) 1111 1111 1111 1111 1111 1111 1111 1111 0100 1001 1100 0110 1001 0000 0011 0101
字符串的哈希值
自定义对象作为 key

哈希值的进一步处理: 扰动计算

private int hash(K key) {
  if(key == null) return 0;
  int h = key.hashCode();
  return (h^ (h >>> 16)) & (table.length - 1);
}

装填因子

TreeMap VS HashMap

LinkedHashMap

上一篇下一篇

猜你喜欢

热点阅读