- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我的问题是为什么 hashmap bucket size 是 2 的幂,我已经在 stackoverflow 上看了很多答案,但我仍然不相信。原因是:
我读到容量是 2 的幂使得 & 操作更有效地计算索引,所以我的问题是它在这里到底有什么用。我的大小可能是 3 的幂,我仍然可以像这样执行 & 操作 (hash)&(length-1) 那么为什么它应该是 2 的幂?
另外,如果容量不是 2 的幂,为什么我需要做余数运算?
最佳答案
当你从一个 2 的幂数中减去 1 时,你得到的是一个二进制表示全为 1 的数。 16 是 2 的幂。如果你从中减去 1,你会得到 15,它的二进制表示是 1111。现在,如果你对任何数字与 1111 进行按位与,你将得到的最后 4 位换句话说,它等于数字除以 16 的模数(除法运算通常是一项昂贵的运算。因此,按位运算通常优于除法)。最后 4 位将计算为 0 到 15 之间的任何数字,这些数字是您的基础数组的索引。
您可以改用 17 号。在这种情况下,从中减去 1 后,您将得到 16,即二进制形式的 10000。现在你用 16 对一个数字进行有点明智的 AND,你将丢失数字的所有位,除了从末尾算起的第 5 位。因此,无论您取多少,数组索引都将是 16 或 0。这意味着您会遇到很多冲突,这反过来又意味着性能不佳。您需要 O(log n) 而不是 O(1) 的检索,因为当发生碰撞时,给定桶中的所有节点都将存储在红黑树中。不仅。如果您在多线程环境中使用 ConcurrentHashMap
,您会遇到很多同步,因为所有新添加的内容最终都会出现在非常少量的桶中(只有两个 - 0 和 16上述情况),当你在一个已经有其他节点的桶中添加新节点时,该桶将被锁定,以避免由于多线程修改而导致数据不一致。因此,其他尝试添加新节点的线程需要等到当前线程释放锁。
最后,我还应该提一下,Java HashMap
实现还将 key 的哈希码向右移动 16 位,并在执行按位与 ( length - 1) 以确保也捕获高阶位的影响。
所以,基本上重点是,如果大小是 2 的幂,则键将更均匀地分布在数组中,冲突最小,从而导致更好的检索性能(并且在 ConcurrentHashMap< 的情况下同步更少
) 与任何其他不是 2 的幂的大小进行比较时。
关于java - 为什么 HashMaps 使用二的幂来实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53526790/
我在编写数学函数时遇到了麻烦。它应该接受 3 个变量并像这样计算方程。 答案 = x(1 + y/100)^ z 我把它写成: public compute_cert (int years, doub
我正在开发一个计算器,以便更好地学习 Java。我编写了自己的代码来使用 BigDecimal 参数计算幂。截至目前,代码无法处理分数幂,例如 2^2.2。为了解决这个问题,我想在我的代码中实现指数恒
我正在寻找一种算法(或者更好的是,代码!)来生成幂,特别是奇数指数大于 1 的数字:三次幂、五次幂、七次幂等等。然后我想要的输出是 8, 27, 32, 125, 128, 216, 243, 343
在 Codewars 上找到这个。该函数接受两个参数 A 和 B,并返回 A^B 的最后一位。下面的代码通过了前两个测试用例,但不会通过下一个测试用例。 def last_digit(n1, n2):
像 2^(2%1) 这样的表达式在 GHCi 中不会进行类型检查,并且错误消息是神秘的。为什么这不起作用,我需要改变什么? 我无法转换为其他类型,我希望将其用于 27^(1%3) 等表达式。 最佳答案
我的二次幂没有达到应有的水平,所以我想也许我可以 #define 做点什么。 不幸的是,我在预处理器指令方面经验不足,我不知道如何做 for 循环之类的事情。我看了看: http://www.cplu
如何在 Math.net 中获得三角函数的幂? Expr x = Expr.Variable("x"); Expr g = (2 * x).Sinh().Pow(2); g.ToString()给出输
我正在尝试拟合这个渐近接近零(但从未达到它)的数据。 我相信最好的曲线是逆逻辑函数,但欢迎建议。关键是预期的衰减“S 曲线”形状。 这是我到目前为止的代码,以及下面的绘图图像,这是一个非常丑陋的适合。
这个问题在这里已经有了答案: The most efficient way to implement an integer based power function pow(int, int) (2
我试图获得指数非常大的 double 值的幂(Java BigInteger 可以包含它(指数),例如:10^30 ) 也就是说,我想找到类似 1.75^(10^30) 或 1.23^(3423453
我有一个数学表达式,例如: ((2-x+3)^2+(x-5+7)^10)^0.5 我需要更换 ^符号到pow C语言的功能。我认为正则表达式是我需要的,但我不知道像专业人士那样的正则表达式。所以我最终
这是我的 previous question on bit flags 的后续内容,我澄清了一些重大误解。 我需要创建这些函数来查找包含零个或多个标志的 int 中的单个位标志: BitBinaryU
我已经在 java 中为 BigInteger 尝试过 modPow() 函数。 但它需要太长时间。 我知道模乘法,甚至也知道求幂。 但由于条件限制,我无法解决这个问题。 a、b 的值可以包含 100
我是一名优秀的程序员,十分优秀!