背景
  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倍。必须满足这样的扩容,才能满足散列出来的结果,没有重复的。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐