1.hashmap的常见的静态属性
// hashmap默认的容器大小(16)
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;
// hashmap默认最大的容器大小,超过不再扩容
static final int MAXIMUM_CAPACITY = 1 << 30;
// hashmap默认的负载因子(0.75)
static final float DEFAULT_LOAD_FACTOR = 0.75f;
// hashmap默认的链表结点树化的个数(8),包含8,实际是7,会进行-1操作
static final int TREEIFY_THRESHOLD = 8;
// hashmap默认的树转链表的结点个数(6),包含6
static final int UNTREEIFY_THRESHOLD = 6;
// hashmap默认链表树化的数组大小(64),包含64
static final int MIN_TREEIFY_CAPACITY = 64;
2.hashmap常见的静态方法
// 获取节点的hash值,算法是key的hash值和该值右移16位作异或运算,能够更好的均匀散列在数组上
// 明确一点位运算的速度大于其他的运算速度
static final int hash(Object key) {
int h;
// 从此处可以看到当key为null时,元素会被插入到数据下标为0的位置
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
/*
1147483647
0100-0100 0110-0101 0011-0101 1111-1111 原值
0000-0000 0000-0000 0100-0100 0110-0101 左移16后
0100-0100 0110-0101 0111-0001 1001-1010 异或运算的值
0100-0100 0110-0101 0011-0101 1111-1111 原值
0000-0000 0000-0000 0100-0100 0110-0101 左移16后
0000-0000 0000-0000 0000-0101 0110-0101 与运算结果
0100-0100 0110-0101 0011-0101 1111-1111 原值
0000-0000 0000-0000 0100-0100 0110-0101 左移16后
0100-0100 0110-0101 0111-0101 1111-1111 或运算结果
特点:
异或运算高16不变,低16位保留了原高16位和原低16位的值
与运算高16丢失了,低16为偏向于0
或运算高16不变,低16位偏向于1
*/
// 当指定一个容器大小时,确保容器大小是2的倍数
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16; // 如果是58,走完此步后会变成63
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
/*
实现过程如下:
给定的值是58
0000-0000 0000-0000 0000-0000 0011-1001 n = cap - 1
0000-0000 0000-0000 0000-0000 0011-1001 n
0000-0000 0000-0000 0000-0000 0001-1100 n>>>1
0000-0000 0000-0000 0000-0000 0011-1101 n |= n >>> 1
0000-0000 0000-0000 0000-0000 0011-1101 n
0000-0000 0000-0000 0000-0000 0000-1111 n>>>2
0000-0000 0000-0000 0000-0000 0011-1111 n |= n >>> 2
0000-0000 0000-0000 0000-0000 0011-1111 n
0000-0000 0000-0000 0000-0000 0000-0011 n>>>4
0000-0000 0000-0000 0000-0000 0011-1111 n |= n >>> 4
0000-0000 0000-0000 0000-0000 0011-1111 n
0000-0000 0000-0000 0000-0000 0000-0000 n>>>8
0000-0000 0000-0000 0000-0000 0011-1111 n |= n >>> 8
0000-0000 0000-0000 0000-0000 0011-1111 n
0000-0000 0000-0000 0000-0000 0000-0000 n>>>16
0000-0000 0000-0000 0000-0000 0011-1111 n |= n >>> 16
最终的n的值为 63
*/
3.其他关于hashmap的分析
hashmap的扩容机制
hashmap链表转化成红黑树的过程以及红黑树转化成链表的过程
hashmap的存放元素的实现过程