我试图了解哈希图中的存储桶(索引)是如何通过键确定的,我已经阅读了 3 种确定它的方法,但不可能有 3 种。
1) index = hashCode(key) & (n-1)
2) index = hashcode % number of cells in the map
3) static int indexFor(int h, int length) {
return h & (length-1);
}
我刚开始学习Java,看不懂2500行的hashmap代码。请告诉我索引(存储桶)是如何确定的,执行此操作的方法的名称是什么以及它在哪一行?我们需要的不是猜测,而是文档链接。
3个都是一样的。 1和3是相同的:
h
只是hashCode(key)
,n
和length
也相同,这意味着它们是相同的。
第二个也是相同的:
n
始终是二的倍数,这意味着n-1
,以位为单位,总是类似于 00011111111 - 全零,然后全一。
& x
,其中 x 是这样一个数字,简单地表示:当我们的 n
有 1 位时,不执行任何操作。如果有 0 位,则最终结果也应该有 0 位。在所有这些相当具体的条件下,%n
和& (n-1)
实际上是相同的数学运算。
例如,让我们
n = 8
。
那么
& (n-1)
与“将除底部 3 之外的所有位清零”相同。
与
%8
相同。例如,10 % 8
显然是2。 10 & 7
是..也是2.