HashMap

位运算:

^异或 相同为0,不同为1

>>>无符号右移动

1<<4 左移4位 即16

HashMap的数据结构

1.7之前是数组+链表 。1.8之后是数组+链表+红黑树,链表在数组长度>64并且链表长度>8同时满足才会转换为红黑树,如果链表长度<6则又会转换成为链表。

为什么HashMap支持key为空,而hashTable不支持?

 为什么hashMap的长度是2的幂?

这是jdk8上速度的优化,获取hash值计算下表正常用的计算方式是Key的hash取模数组长度,而jdk为了优化速度采用了位运算,即hash &(length-1)。这两种运算方式相等的前提是数组的长度是2的幂次方。

hashmap的hash函数是怎么设计的为什么?

hashmap的hash函数是先取出hash值,然后将高16位和低16位异或,这是为了减少哈希碰撞的发生。假如,我们数组长度很小,就是16,那么n-1就是1111,这样的值和hashCode()直接做按位与,实际上只是用了哈希值得后面4位。如果哈希值高位变化很大,低位变化很小,就很容易造成哈希冲突,所以把高位利用起来,从而解决了这个问题。

hashmap put方法的原理

1、判断table是否为空,为空则扩容

2、用key的hash值 & 数组长度-1 得到数组下标索引,判断该桶位置是否为null,如果是null,直接插入。如果不为null,判断key的hash值与key的equal是否与该位置的key都相等,都相等,则覆盖该value,返回就的value值

3.如果其中之一不相等,则判断是否为树节点,或者是链表。如果是树节点,则按树节点的方式插入。如果是链表则会遍历链表,再比较key的值以及key的equal值同时相等,就覆盖旧值,并且返回旧值,插入完成后判断是否满足转红黑树条件

4、插入完成后,会判断是否需要扩容,如果数组size>threshold阈值则会进行扩容。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值