ThreadLocal源码阅读一:散列算法,魔数 0x61c88647 学习

背景
  1. 为什么选择此魔数?
过程
  • 源代码
    在这里插入图片描述

  • 例子演示及其结果
    在这里插入图片描述
    长度为16: 7 14 5 12 3 10 1 8 15 6 13 4 11 2 9 0

    长度为32: 7 14 21 28 3 10 17 24 31 6 13 20 27 2 9 16 23 30 5 12 19 26 1 8 15 22 29 4 11 18 25 0

    长度为64: 7 14 21 28 35 42 49 56 63 6 13 20 27 34 41 48 55 62 5 12 19 26 33 40 47 54 61 4 11 18 25 32 39 46 53 60 3 10 17 24 31 38 45 52 59 2 9 16 23 30 37 44 51 58 1 8 15 22 29 36 43 50 57 0

    结论长度是2的N次方的,散列出来,没有重复的。

  • 修改长度
    在这里插入图片描述
    结果
    在这里插入图片描述
    结论散列出来有很多重复的。

  • 魔数的来源
    在这里插入图片描述
    结果
    在这里插入图片描述
    这个魔数恰好与长度为2的N次方的数,散列出来的结果不会重复。

    设计者会为什么会考虑这样的实现呢?也就是他为什么能够想到这样的实现?还是说他的数学功底很扎实,知道这样散列是完美的?

小结
  1. hashCode = i * HASH_INCREMENT + HASH_INCREMENT,每次新增ThreadLocal实例到Entry[],自增0x61c88647。
  2. 元素散列位置(数组下标)= hashCode & (length-1)
  3. 长度是源代码给定的,用户不能设置。默认是16,每次扩容是原来的2倍。必须满足这样的扩容,才能满足散列出来的结果,没有重复的。
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值