hashmap的常见静态属性和方法

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的存放元素的实现过程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值