HashMap工作原理有关问题求解

HashMap工作原理问题求解
本帖最后由 carrd2008 于 2015-02-02 10:52:36 编辑
最近我在研究Map集合的工作原理,以便做些优化。
首先看的是HashMap。

写一行初始化HashMap的代码:(debug模式)
Map<String, String> map = new HashMap<String, String>(3, 0.75f);
map.put("a","第1个元素");

我分别在HashMap的构造方法、put方法里加了断点。
执行结果居然是先进入put方法,执行了好几次后,才进入构造方法。。。
而且进入put方法时,阀值显示的是12。
我设置的初始化容量是3,阀值应该是3 * 0.75才对。
put方法被执行了大概十几次,然后才进入构造方法。

构造方法还没执行,对象实例都还没创建,怎么能直接执行put方法呢?
为什么会这样,谁知道吗?
------解决思路----------------------
map.put("a","第1个元素"); 打个断点 f5 step into
------解决思路----------------------
1、初始化一个固定大小的数组用以存放对象
2、put对象的时候,首先判断数组是否已满,已满则重新创建一个更大的数组,并复制原数字中的对象到新数组,根据key计算其hash值,然后再对hash进行散列,用散列值&数组长度,求出该key应该存放在数组中的位置,将对象放入。
------解决思路----------------------
这个先进入put方法,实际上执行的却不是你的这次调用,而是在其它类中被调用的。
在系统的classloader中就用了hashmap,所以jvm在加载你的class的时候就已经使用到了hashmap了,所以出现这种结果就没有什么好奇怪了。