java entryset key值_java – HashMap如何以及何时初始化entrySet并向其中添加值

我找到了一个非常神奇的东西,简单的代码如下:

public class Demo{

public static void main(String[] args){

HashMap map = new HashMap();

map.put("a", "aa");

System.out.println("end");

}

}

在调用之后

HashMap map = new HashMap();

77a98753384b52fefd6d28e46c18a2a5.png

字段变量entrySet不为null,也就是说它已经初始化.

那么这是我的第一个问题,什么时候初始化了entrySet?

似乎相关的代码应该在HashMap的构造中,但下面是这个构造函数的源代码

public HashMap() {

this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted

}

它似乎不存在初始化entrySet的代码.

事情还在继续.

在调用之后

map.put("a","aa")

字段变量表和entrySet的内容如下图所示.

 83da6f4f3d15c2f6603356ff6502d132.png

那么这是我的第二个问题:将此值添加到entrySet中时?

似乎应该是put方法实现这些东西.

以下是放方法.

public V put(K key, V value) {

return putVal(hash(key), key, value, false, true);

}

它调用putVal方法,下面是putVal的一些代码

final V putVal(...) {

....

tab[i] = newNode(hash, key, value, null);

....

++modCount;//after invoke this the entrySet is still empty

if (++size > threshold)

resize();//this has not been executed

afterNodeInsertion(evict);//I debug several times, sometimes before invoke this the entrySet has an Element and sometimes

return null;

}

在调用之后

++modCount;

entrySet为空

并在调用之前

afterNodeInsertion(evict);

entrySet有一个元素.

但似乎这两行之间的代码与entrySet没有任何关系.

我想也许有几个线程操作entrySet然后我用jvm_ti编写一个小工具来打印threadID,它调用java.util包下面的类,发现只有一个线程.

那我想念的是什么?调试过程中是否存在问题?希望我清楚地描述我的问题,一切都会被欣赏.

add:我的java版本是1.8.0_77,eclipse版本是4.6.1和4.5.1

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值