关于HahsMap调试出现的问题
调试HashMap我想很多人都会遇到 所以大部分新手会在hashMap内部需要调试的地方 加入断点 然后点击Debug 但是程序却在其他地方停下来了??
例子
比如博主在 hashMap构造函数 HashMap(int initialCapacity) 内部加入相应的断点
以下伪代码 在第89行和90行加入断点
HashMap ....=new HashMap<>(15);
public HashMap(int initialCapacity) { //89
this(initialCapacity, DEFAULT_LOAD_FACTOR);//90
}
但是博主 无论设置初始容量为多少时 都会在initialCapacity为11的时候停下来
问题出现在这里
initialCapacity 中明明设置了15 为什么在这里变成了11
难道是java的机制自动变成11 还是IDEA的bug(这显然不太可能)
那我们验证一下 后面又分别尝试了
HashMap ....=new HashMap<>(17);
HashMap ....=new HashMap<>(22);
Debug中的initialCapacity都显示11
后面又在EClipse中运行同样的调试代码 initialCapacity同样显示11
那试试从调用栈入手
:467, HashMap (java.util)
:74, Attributes (java.util.jar)
:64, Attributes (java.util.jar)
:51, Manifest (java.util.jar)
getManifestFromReference:194, JarFile (java.util.jar)
getManifest:180, JarFile (java.util.jar)
getManifest:981, URLClassPath$JarLoader$2 (sun.misc)
defineClass:450, URLClassLoader (java.net)
access$100:73, URLClassLoader (java.net)
run:368, URLClassLoader$1 (java.net)
run:362, URLClassLoader
AppClassLoader (sun.misc)
loadClass:357, ClassLoader (java.lang)
loadClassAndStartAgent:304, InstrumentationImpl (sun.instrument)
loadClassAndCallPremain:401, InstrumentationImpl (sun.instrument)
从调用栈 我们可以看出 代码是在 467中停下来了 也就是我们 设置断点的地方
那是谁调用了这个HashMap 答案在调用栈第二行
Attributes中调用的
构造了一个Map时 遇到断点自然会停下来 此时的initialCapacity始终为11
//调用栈的第三行
public Attributes() {
this(11);
}
//调用栈的第二行
public Attributes(int size) {
map = new HashMap<>(size);//size 11
}
也就是说无论待调试的代码是什么都会在此处停下 如果在相应的HaspMap构造函数中设置了断点
这是因为HashMap在很多地方都会使用,不光是你,包括框架,工具,第三方jar都有可能随时使用到
怎么解决呢
注意 博主使用的是IDEA IDEA的整个流程
在断电处单击右键 codition栏中添加 initialCapacity==设置的容量
然后就会在相应的初始容量中停下来了