代码之家  ›  专栏  ›  技术社区  ›  Ricola

intellij:debugging new hashset()step by step:field在未看到的情况下初始化

  •  -1
  • Ricola  · 技术社区  · 6 年前

    我不知道这个问题是由我的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

    1 回复  |  直到 6 年前
        1
  •  3
  •   Andreas dfa    6 年前

    调试时,调试器将尝试向您显示 HashSet ,所以它调用集合 toString() 方法,它间接调用 keySet() 背衬方法 HashMap 对象,从而初始化 keySet 字段。

    调试器在调用时忽略断点 托斯特林() 所以你看不到电话。