HashMap源码解析
基本结构123456789101112131415161718192021222324252627282930// 默认容量16static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16// 默认最大容量static final int MAXIMUM_CAPACITY = 1 << 30;// 默认负载因子0.75 16*0.75 = 12 即容量为13时扩容static final float DEFAULT_LOAD_FACTOR = 0.75f;// 树转化临界点8 链表容量为9时扩容static final int TREEIFY_THRESHOLD = 8;// 树退化临界点6 扩容时如果链表容量<=6,退化为链表static final int UNTREEIFY_THRESHOLD = 6;// 树容量 转换为红黑树时,如果table长度小于64,扩容static final int MIN_TREEIFY_CAPACITY = 64;// 链表节点static class N ...
为什么HashMap的hash值要右移16位?
前言
一时兴起,去看了看 HashMap 的源码,越过大段的注释后,第一个方法就给我难住了。为什么这么计算出的 hash 值可以更加分散呢?
1234static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}
概念介绍
<<: 左移运算符,num << 1,相当于 num 乘以 2 低位补 0举例:3 << 2将数字 3 左移 2 位,将 3 转换为二进制数字:0000 0000 0000 0000 0000 0000 0000 0011,然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移 2 位,最后在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,则转换为十进制是 12。
>>: 右移运算符举例:11 >> 2则是将数字 11 右移 ...