我不知道这个问题是由我的JDK版本,我的版本的因特利利引起的,还是因为缺乏Java完全的理解。
我在检查
HashSet
实现,我想知道
keySet
已初始化。我看到了方法
public Set<K> keySet() {
Set<K> ks = keySet;
if (ks == null) {
ks = new KeySet();
keySet = ks;
}
return ks;
}
这似乎是第一次设置字段的地方,但是当我将断点放在条件上时,
ks
绝不是空的!
所以我决定检查它是在什么时候初始化的,但我似乎找不到它。
我只需使用intellij逐步运行以下指令(1)
强制进入
按钮:
HashSet<String> set = new HashSet<>();
我得到指示(2):
map = new HashMap<>();
根据指示(3)
this.loadFactor = DEFAULT_LOAD_FACTOR;
在指令(3)之后,就在离开构造函数之前
public HashMap()
如果我评估这个领域
密钥集
,它仍然为空。
但在这之后,就在指令(2)之后,在离开构造函数之前
public HashSet()
如果我评估
map.keySet
它不再是空的!
这是什么巫术?我是在这里缺少什么东西,还是我的调试器有问题?
我正在使用JDK-9.0.1和Intellij IDEA 2017.2.5