HashMap1.8和HasMap1.6的区别

(1)1.6在put(null,value);的时候讲这个键值对放在哈希桶的第一个(直接判断),1.8是计算null的hash值(0)还是放在第一个
(2)1.6中的put使用链表的头插法,而1.8中使用的是尾插法。
(3)hash值计算不同:1.6: h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); 1.8:return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
1.6:使用hash()方法对一个对象的hashCode进行重新计算是为了防止质量低下的hashCode()函数实现。1.8:让高16位也可以参与运算。
h & (length-1) 计算hash桶的位置,当length为2的n次方时,h&(length - 1)就相当于对length取模,而且速度比直接取模要快得多,这是HashMap在速度上的一个优化。
(4)扩容、重hash的时候,1.6还是采用头插法,并对原链中的每一个元素重新确定在新表中的位置(扩容到原来的2倍)。1.8使用尾插法,对hash&old.length0和hash&old.length1分成两条链表,使用尾插法,==0表示与原表中的位置相同,==1表示位置为(原表的位置+oldCapacity)
(5)get()方法的时候,1.6先判断key值是否为空,是的话从第一个桶里面找,不是的话,hash&(length-1)确定桶的位置,然后循环往下找。1.8 先判断表!=null && 表的长度!=0 计算出的桶的位置也不为null,如果是第一个那么直接返回,否则判断first.next的类型,是tree的话按照树的方式查找,否则按照链表的方式查找

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值