Java8源码阅读之HashMap之调试验证和思考
2017-04-01 17:09
281 查看
在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的。
我在刚开始验证时,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的。
相关文章推荐
- Java Jdk1.8 HashMap源码阅读笔记一
- Java源码阅读-HashMap
- Java Jdk1.8 HashMap源码阅读笔记二
- Java集合源码阅读之HashMap
- JAVA源码阅读-HashMap(一)
- Java源码阅读-HashMap
- Java源码阅读之HashMap(1)
- Java源码阅读之HashMap
- JAVA 集合类(java.util)源码阅读笔记------HashMap
- Hadoop2.6.0运行mapreduce之Uber模式验证 标签: hadoopmapreduce源码uberjava 2016-05-05 14:55 19815人阅读 评论(2) 收藏 举报
- Java8源码阅读之HashMap
- java基础-HashMap动态扩容数据转移源码阅读
- Java源码阅读之LinkedHashMap
- java集合源码阅读笔记-HashMap
- Java源码阅读之HashMap
- Java源码阅读——HashMap
- Java Jdk1.8 HashMap源码阅读
- Java源码阅读之HashMap
- Java源码阅读-ArrayList
- Java java.util.HashMap实现原理源码分析