znajdę bardzo magiczne rzeczy, prosty kod jak poniżej:jak i kiedy HashMap zainicjować entrySet i dodać wartość do niego
public class Demo{
public static void main(String[] args){
HashMap<String,String> map = new HashMap<String,String>();
map.put("a", "aa");
System.out.println("end");
}
}
po powołać
HashMap<String,String> map = new HashMap<String,String>();
pole zmienna entrySet nie jest null, to znaczy zostało zainicjowane.
Wtedy to mój pierwszypytanie, kiedy entrySet została zainicjowana? wydawało odpowiedni kod powinien znajdować się w konstrukcie HashMap, ale poniżej jest kod źródłowy tego konstruktora
public HashMap() {
this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
wydawało tam nie istnieje kod, który zainicjować entrySet.
i coś się dzieje. po powołać
map.put("a","aa")
zawartość pola zmienna stół i entrySet jak poniżej ujęcia. To jest mój drugi problem: kiedy dodać tę wartość do zestawu wpisów? Wyglądało na to, że powinno to być put. i poniżej jest metoda put.
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
inicjować putVal sposób i poniżej pewne kod 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;
}
po wywołać
++modCount;
entrySet pusty i przed wywołać
afterNodeInsertion(evict);
element entrySet ma element. ale wydawało się, że kod pomiędzy tymi dwoma wierszami nie ma nic wspólnego z entrySet. Myślę, że istnieje kilka wątków działać entrySet następnie napisać małe narzędzie o jvm_ti wydrukować ThreadID które powołują klasę poniżej pakietu java.util i uważają, że jest tylko jeden wątek.
W takim razie tęsknię? Czy istnieje problem podczas debugowania? Chciałbym jasno opisać mój problem i wszystko byłoby docenione.
add: moja wersja Java jest 1.8.0_77 i zaćmienie wersja jest 4.6.1 i 4.5.1
Dlaczego to ma znaczenie? Jak wpływa na umowę? –
@SkinnyJ to nie ma znaczenia, ale chcę znać faktyczne szczegóły i napotkać pewne pytanie. –
Czy można dodać punkt przerwania do metody entrySet() w HashMap? Zakładam, że tam został zainicjowany zestaw wpisów. Jeśli umieścisz tam punkt przerwania i wątek się zatrzyma, zobaczysz ślad stosu kodu, który wywołuje tę metodę. – toongeorges