HashMap源码分析

1、变量

哈希桶的长度,也就是数组的长度。1<<4表示1左移4次,是2的4次方,16

 

默认负载因子

树化的条件之一(另一个是数组长度要超过64),链表长度超过8以后,就转化为红黑树

解树化条件,红黑树结点小于6个,就没必要用树存了,转化为链表

树化的条件之一,数组长度超过64

结点实现了Map的Entry接口,所以在HashMap中可以得到,可以把这个Map.Entry就理解成结点。实际上是set。

2、构造方法

两个参数的构造方法,传入指定容量负载因子

一个参数的构造方法,传入初始容量

空参的构造方法,负载因子是默认值,0.75。重点注意:此时并没有初始化数组大小,仅仅只初始化了负载因子。分配数组大小是在put里做到的。

可以直接把实现了Map的集合传入HashMap。

3、函数方法

put方法会调用hash()方法,和putVal()方法

其中hash()方法是找到传入的key的hashCode值,赋给h变量,再让h和h右移16位的结果做异或,目的是为了得到更均匀的值。再将这个值返回。

分为多种情况:

当使用空参构造方法时,数组长度是没有初始化的,为空。此时第一次调用put方法时,数组大小被默认分配为16,经过这个if语句以后才真正的让数组初始化了

调用resize()

如果数组位置为空,就直接插,不为空就往下判断,用尾插法插入,同时判断是不是要变成红黑树。

根据binCount来判断的,创造一颗红黑树

this.threshold就是数组长度,这个tableSizeFor会让数组的长度尽可能的接近2的次幂。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值