2016-06-15 10 views
4
class MyObject { 
    int field; 
    public void setField(int arg1) { 
     this.field = arg1; 
    } 
} 

HashMap<String, MyObject> map; 
... 
... // put some MyObjects in the map with strings as keys 
... 
for (MyObject object : map.values()) { 
    object.setField(12345); 
} 

Die Änderungen, die ich an Objekten innerhalb des Zyklus vorgenommen habe, werden an denselben Objekten in der Karte vorgenommen.Java: Was bedeutet diese Methode der Klasse HashMap?

Der Führer sagt dies über die values() Methode

Gibt eine Sammlung Blick auf die in dieser Karte enthaltenen Werte. Die Sammlung wird von der Karte unterstützt, sodass Änderungen an der Karte in der Sammlung widergespiegelt werden und umgekehrt.

Bedeutet "Änderungen an der Karte" "Änderungen an den gemappten Objekten"? Auf diese Weise kann die setField Methode die Objekte in der Karte ändern?

+0

Das ist richtig. Probieren Sie es aus und sehen Sie. – hexafraction

+0

Ja, da die Karte tatsächlich Zeiger auf die realen Objekte enthält, erhalten Sie die gleichen Zeiger, wenn Sie die Methode 'values ​​()' verwenden, und Sie manipulieren daher exakt dieselben Objekte im Speicher. – ToVine

+0

Nein. Dies bedeutet, dass wenn Sie die Zuordnungen ändern, dh. Hinzufügen, Entfernen, Ändern von Schlüssel-Wert-Paaren, diese Änderungen sind in der zurückgegebenen Sammlung sichtbar. –

Antwort

6

Bedeutet "Änderungen an der Karte" "Änderungen an den gemappten Objekten"?

Es bedeutet, Änderungen an der Karte (aber auch siehe unten). Die Auflistung ist eine Live-Ansicht der Werte in der Karte. Wenn Sie also Einträge zur Karte hinzufügen oder Einträge aus der Karte entfernen, spiegelt die Sammlung diese Änderungen wider. Die beiden sind verbunden. ZB:

Map<String, String> m = new HashMap<String, String>(); 
Collection<String> c = m.values(); 
m.put("hi, "there"); 
System.out.println(c.size()); // 1, not 0 

Live Example


Getrennt: ändert natürlich auf den Zustand der Objekte als Werte in der Karte gespeichert werden, unabhängig davon sichtbar sein, ob Sie den Verweis auf diese Objekte über die bekommen Sammlung oder die Karte; Sie sind Referenzen zu den Objekten, nicht Kopien der Objekte.

+0

Vielen Dank, jetzt ist alles klar. – user3290180

-1

Ein Beispiel für Map, die enthält:

"key1" -> "value1" 
"key2" -> "value2" 

values() wird wieder eine Sammlung von: „Wert1“, „value2“

Und ja, wenn Sie eine mutierenden Methode für ein Objekt in der Verwendung Karte wird in der values() Sammlung geändert, die Sie zuvor abgerufen haben. Aber der interessanteste Teil ist, dass Hinzufügen/Entfernen von Elementen aus der Karte wird dazu führen, dass die Werte Sammlung ändern.

Beispiel:

Map<String, String> map = new HashMap<>(); 
Collection<String> vals = map.values(); 
System.out.println("Before: " + vals); 
map.put("key1", "value1"); 
System.out.println("After: " + vals); 

Dies drucken:

Before: [] 
After: [value1] 
0

Die Werte Methode gibt eine Reihe von Verweisen auf Ihre Objekte im Speicher. Da Ihre Objekte veränderbar sind, werden alle an ihnen vorgenommenen Änderungen in der Karte widergespiegelt, da die Karte Referenzen auf denselben Speicher hat.

1

Die Methode HashMap.values() - wie in der Javadoc beschrieben.

Gibt eine Sammlungsansicht der in dieser Map enthaltenen Werte zurück. Die Sammlung wird von der Karte unterstützt, sodass Änderungen an der Karte in der Sammlung widergespiegelt werden und umgekehrt. Wenn die Zuordnung geändert wird, während eine Iteration über die Auflistung ausgeführt wird (außer durch die eigene Entfernungsoperation des Iterators), sind die Ergebnisse der Iteration nicht definiert. Die Auflistung unterstützt das Entfernen von Elementen, wodurch die entsprechenden Zuordnungen aus der Zuordnung über die Operationen Iterator.remove, Collection.remove, removeAll, retainAll und clear gelöscht werden. Die Operationen add oder addAll werden nicht unterstützt.

Das bedeutet, dass es eine Sammlung (ähnlich einer Liste) aller Elemente im Array zurückgibt. Außerdem wird angegeben, dass die Sammlung durch die Zuordnung gesichert wird. Wenn Sie also die Zuordnung ändern, wird auch die Auflistung aktualisiert. Wenn Sie die Auflistung ändern, ändert sich auch die Zuordnung. Beachten Sie, dass es nicht möglich ist, Elemente aus dieser Sammlung hinzuzufügen.

Dieses Beispiel zeigt die Verwendung der Methode ziemlich gut.

public static void main(String[] args) { 
    Map<String, String> mapValues = new HashMap<>(); 
    mapValues.put("Hi", "Hello"); 
    mapValues.put("Bye", "Goodbye"); 
    System.out.println(mapValues.size());//prints 2 
    Collection<String> values = mapValues.values(); 
    values.remove("Hello"); 
    System.out.println(mapValues.size());//prints 1 
    System.out.println(values.size());//prints 1 
    mapValues.put("Morning", "Good morning"); 
    System.out.println(mapValues.size());//prints 2 
    System.out.println(values.size());//prints 2 
}