我正在阅读Java 8 HashMap的实现细节,有没有人能告诉我为什么Java HashMap的初始数组大小特定为16?16有什么特别之处?为什么它总是2的幂?谢谢。
我正在阅读Java 8 HashMap的实现细节,有没有人能告诉我为什么Java HashMap的初始数组大小特定为16?16有什么特别之处?为什么它总是2的幂?谢谢。
n % d = n & (d-1)
并且模数被用于确定项目映射到内部数组中的哪个索引 - 这意味着它在Java HashMap中经常出现。模数需要除法,这也比使用按位与
运算符要低效得多。您可以通过阅读关于数字逻辑的书来自我验证这一点。按位与
因此保存了数字n中所有低于位置t的位的值(如上所述),并将其余部分设置为0。ArrayOutOfBoundsIndexException
异常,但如果你进行修正,你将得到与“按位与”方法相同的结果。 - Anish Goyal在选择hash & (n - 1)
和modulo
时,还有一件事情需要注意,那就是负数的哈希值。hashcode
的类型为int,当然可能是负数。在Java中,对负数取模会得到负数,而&
则不会。
但这只对哈希范围小的数据(如字节或字符)真正重要。