Я не знаю, вызвана ли проблема моей версией JDK, моей версией IntelliJ или отсутствием полного понимания Java.
Я проверял HashSet
реализацию и хотел знать, когдаполе keySet
инициализируется.Я видел метод
public Set<K> keySet() {
Set<K> ks = keySet;
if (ks == null) {
ks = new KeySet();
keySet = ks;
}
return ks;
}
, который, кажется, является местом, где поле устанавливается впервые, но когда я ставлю свою точку останова на условие, ks
никогда не бывает нулевым!Поэтому я решил проверить, в какой момент он инициализируется, но, похоже, я его не нашел.Я просто выполнил следующую инструкцию (1) шаг за шагом, используя кнопку Force Step Into IntelliJ:
HashSet<String> set = new HashSet<>();
Я попал в инструкцию (2):
map = new HashMap<>();
И к инструкции (3)
this.loadFactor = DEFAULT_LOAD_FACTOR;
После инструкции (3), непосредственно перед выходом из конструктора public HashMap()
, если я оцениваю поле keySet
, оно все еще равно нулю.
Но сразу после этого, точно после инструкции (2), перед тем, как покинуть конструктор public HashSet()
, если я оцениваю map.keySet
, он больше не равен нулю!
Что это за колдовство?Я что-то здесь упускаю или это проблема моего отладчика?Я использую jdk-9.0.1 и IntelliJ IDEA 2017.2.5