问题
读完大H的文章关于HashMap容量的初始化,还有这么多学问,了解到HashMap的初始化容量应该为((float)s / loadFactor) + 1.0F
,具体关于负载因子、扩容等机制可以看看大H的这篇文章。看完这篇文章后,有个问题还未解决:既然HashMap的容量在size>capacity*loadFactor
时会扩容,那么简单的将初始容量设置为((float)s / loadFactor)
即可,为什么要在后面+1.0F
呢?
解决
百度未果后直接google搜索((float)s / loadFactor) + 1.0F
,遂在stackoverflow看到这个问题和答案:
- HashMap底层的table在
entry_count>table_size*load_factory
时会扩容。 - 为了不让HashMap扩容,需要
table_size >= entry_count / load_factor
。 - 公式
((float)s / loadFactor) + 1.0F
中的size是使用float计算的,+1.0F
是因为((float)s / loadFactor)
使用float计算,在转换成整数的时候会进行舍入,为了保证最终计算出来的size足够大不至于触发扩容,所以进行了+ 1.0F
操作。
stackoverflow问题链接about Java 8 Hashmap source: “+1.0F”