Java HashMap 数组大小

标签 java oop collections java-8 hashmap

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

最佳答案

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

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

对于 2 的幂,您可以非常有效地进行取模。n % d = n & (d-1) 当 d 是 2 的幂,并且取模用于确定哪个索引item 映射到内部数组中——这意味着它经常出现在 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

关于Java HashMap 数组大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42941286/

相关文章:

ruby - 面向对象数据库理论

python - 如何修复此属性错误

java - 在 Android 上使用 mp4parser 合并 Mp4

java - 让返回键在自定义工具栏中工作

java - 使用 Collections Java 查找唯一、重复的单词

java - 是否可以使用 Java Guava 将连接器(收集器、累加器)应用于函数?

java - 在 java 集合中搜索对象

tryLock 上的 Java IllegalMonitorStateException

oop - Lua 和对象生成

java - 在字符串列表中使用 Java 8 流 groupingBy?