HashMap原理学习

数据结构:

1.8及以后为 数组+链表+红黑树

计算hash:

参考:https://blog.csdn.net/EnseHeiKe/article/details/115207321

HashMap中的 hash() 算法:

static final int hash(Object key) {
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }

h = key.hashCodde() :
先取key的hashCode为A

h >>> 16 :
再将A右移16位得到B(二进制下右移16位,即将末尾16位去掉)
举例:
0000101000100110 0000100010000011
0000000000000000 0000101000100110
上面的值是原值,下面的值是右移16位后的值。

A ^ B :
A与B异或预算(二进制下相同位置不同时取1,相同位置相同时取0)
举例:
A: 0000101000100110 0000100010000011
B: 0000000000000000 0000101000100110
A ^ B :0000101000100110 0000001010100101

计算数组下标

参考: https://blog.csdn.net/LeeMon23/article/details/120893190
源码中使用的算法为:(n - 1) & hash
其效果等同 hash % n 前者相对后者更高效。

&为java中的位与运算符,位与即二进制下相同位置下都为1则取1,其它均为0.

举例:
0011001 & 1001001 = 0001001

数组大小

数组默认大小 DEFAULT_INITIAL_CAPACITY = 1 << 4
1左移4位即:
0000 0001 原值
0001 0000 左移4位,即后面补上4个0,即16
在线验证:https://jisuan5.com/binary/

你可能感兴趣的:(学习,哈希算法,算法)