在IDE里调试验证
我在刚开始验证时,new Hash(1)时,在其内部设置断点,查看,怎么变成了31,而不是1,很是郁闷;开始怀疑是不是编译时做了优化,但是反编译出来的源码,还是1啊?
原来在加载HashMap类时,JVM调用多次HashMap的方法。所以在调试验证时,需要确保当前断点是在自己的对象中。
思考:
我们已经知道new HashMap(1),本意是想加一个元素,但实际上,在put的时候进行了一次真正resize()。也就两次new数组,然后移动数据。这样的话,是不是上一篇文章中介绍的方法,直接new HashMap(2),这样只new了一次数组,且没有resize,只是浪费了一个空间而已。
但还有个更好的方法,new HashMap(1, 1)。加载因子是1,100%;所以这是perfect!!!
那是不是以后我们都尽量要用new HashMap(n, 1),加载因子是1的。