Java HashMap 数组大小

Imr*_*ran 3 java oop collections hashmap java-8

我正在阅读 Java 8 HashMap 的实现细节,谁能告诉我为什么 Java HashMap 初始数组大小是 16?16 有什么特别之处?为什么它总是两个的力量?谢谢

Ani*_*yal 5

2 的幂无处不在的原因是因为当用二进制表示数字时(就像它们在电路中一样),某些 2 的幂的数学运算更简单,执行起来也更快(想想用 10 的幂进行数学运算是多么容易)我们使用的十进制系统)。例如,乘法在计算机中并不是一个非常有效的过程 - 电路使用的方法类似于您将两个数字与多个数字相乘时使用的方法。乘以或除以 2 的幂需要计算机向左移动位进行乘法或向右移动位进行除法。

至于 HashMap 为什么是 16?10 是动态增长结构(任意选择)的常用默认值,而 16 相距不远 - 但它是 2 的幂。

您可以非常有效地对 2 的幂进行模数。n % d = n & (d-1)当 d 是 2 的幂时,模数用于确定项目映射到内部数组中的哪个索引 - 这意味着它经常出现在 Java HashMap 中。模数需要除法,这也比使用bitwise and运算符效率低得多。你可以通过阅读一本关于数字逻辑的书来说服自己。

bitwise and对 2 的幂以这种方式工作的原因是因为 2 的每个幂都表示为一个设置为 1 的位。假设该位是 t。当您从 2 的幂中减去 1 时,您将 t 以下的每一位都设置为 1,并将 t 以上的每一位(以及 t)都设置为 0。Bitwise and因此从数字 n 中保存位置 t 以下所有位的值(如表达的以上),并将其余设置为0。

但这对我们有什么帮助呢?请记住,在除以 10 的幂时,您可以计算 1 后面的零的数量,并从被除数的最低位开始取该位数以求余数。示例:637989 % 1000 = 989。类似的属性适用于只有一位设置为 1,其余设置为 0 的二进制数。示例:100101 % 001000 = 000101