Il codice sorgente di HashMap.values()
è la seguenteIn che modo HashMap.values () e HashMap.keySet() restituiscono valori e chiavi?
public Collection<V> values() {
Collection<V> vs = values;
return (vs != null ? vs : (values = new Values()));
}
Come si può vedere, quando il metodo values()
prima chiamata, semplicemente restituisce un oggetto Values
. L'oggetto Values
è una sottoclasse di AbstractCollection
senza alcun costruttore e, naturalmente, non contiene alcun elemento. Ma quando ho chiamato il metodo, ha restituito una collezione rapidamente
Collection<String> values = map.values();
System.out.println(values);
Questo è così strano. Non solo values()
, ma anche il metodo keySet()
e entrySet()
restituiscono tali oggetti vuoti. Quindi, ecco la mia domanda, quando e in che modo questi metodi restituiscono oggetti con elementi di cui abbiamo bisogno?
'Nota che questo significa anche che la raccolta che ricevi non è una copia, ma si riferisce ancora al contenuto originale di HashMap e quindi cambia quando aggiorni la HashMap:' Che è anche chiaramente enunciato nel contratto di 'Map.values () ', per evitare qualsiasi malinteso. – biziclop
Una classe interna è una classe nidificata non statica, cioè se la classe era statica, non sarebbe una classe interna, ma semplicemente una classe nidificata statica. https://docs.oracle.com/javase/tutorial/java/javaOO/nested.html – Sardtok
@Sardtok: Grazie per il suggerimento, ho appena modificato la risposta per utilizzare la terminologia ufficiale. – mastov