想了解更多数据结构以及算法题,可以关注微信公众号“数据结构和算法”,每天一题为你精彩解答。也可以扫描下面的二维码关注
ThreadLocal中的0x61c88647_5e



在ThreadLocal中有个魔法数字0x61c88647,为什么要使用这个数组,16进制看不明白,我们来把它打印出来

public static void main(String[] args) {
System.out.println(0x61c88647);
}

运行结果是

1640531527

但这个数字还是看不懂,我们来看这样一个公式

g = (√5 - 1) ÷ 2
res=2^32 * (1 - g)

我们看到g的结果其实就是常见的黄金分割点的值0.618,再来看下面这段代码

public static void main(String[] args) {
System.out.println("0x61c88647的十进制是:" + 0x61c88647);
double goldenSectionRatio = (Math.sqrt(5) - 1) / 2;
double a = 1 - goldenSectionRatio;
System.out.println("goldenSectionRatio的值是:" + goldenSectionRatio);
double res = (Math.pow(2, 32) * a);
System.out.println("res的值是:" + res);
}

看一下运行结果

0x61c88647的十进制是:1640531527
goldenSectionRatio的值是:0.6180339887498949
res的值是:1.6405315265027695E9

我们看到计算的结果值1.6405315265027695E9实际上就是1.6405315265027695乘以10的9次方,四舍五入之后和1640531527完全一样。

这里只能说选择这个值考虑了黄金分割值0.618,黄金分割点的值在数学中是一个很重要的值,常见的斐波那契数列,当n越大的时候,前一个值和后一个值的比就越接近黄金分割点。



ThreadLocal中的0x61c88647_魔数_02