Ich bekomme anscheinend doppelte Schlüssel in der standardmäßigen Java HashMap. Mit "duplizieren" meine ich, dass die Schlüssel durch ihre equals()
Methode gleich sind. Hier ist die problematische Code:Warum bekomme ich doppelte Schlüssel in Java HashMap?
import java.util.Map;
import java.util.HashMap;
public class User {
private String userId;
public User(String userId) {
this.userId = userId;
}
public boolean equals(User other) {
return userId.equals(other.getUserId());
}
public int hashCode() {
return userId.hashCode();
}
public String toString() {
return userId;
}
public static void main(String[] args) {
User arvo1 = new User("Arvo-Part");
User arvo2 = new User("Arvo-Part");
Map<User,Integer> map = new HashMap<User,Integer>();
map.put(arvo1,1);
map.put(arvo2,2);
System.out.println("arvo1.equals(arvo2): " + arvo1.equals(arvo2));
System.out.println("map: " + map.toString());
System.out.println("arvo1 hash: " + arvo1.hashCode());
System.out.println("arvo2 hash: " + arvo2.hashCode());
System.out.println("map.get(arvo1): " + map.get(arvo1));
System.out.println("map.get(arvo2): " + map.get(arvo2));
System.out.println("map.get(arvo2): " + map.get(arvo2));
System.out.println("map.get(arvo1): " + map.get(arvo1));
}
}
Und hier ist die resultierende Ausgabe:
arvo1.equals(arvo2): true
map: {Arvo-Part=1, Arvo-Part=2}
arvo1 hash: 164585782
arvo2 hash: 164585782
map.get(arvo1): 1
map.get(arvo2): 2
map.get(arvo2): 2
map.get(arvo1): 1
Wie Sie sehen können, die equals()
Methode auf den beiden User
Objekte zurückkehrt true
und deren Hash-Codes sind die gleichen aber sie bilden jeweils eine eindeutige key
in map
. Weiterhin unterscheidet map
weiterhin zwischen den beiden User
Schlüsseln der letzten vier get()
Anrufe.
Dies widerspricht direkt die documentation:
Formaler wenn diese Karte eine Zuordnung von einem Schlüssel k auf einen Wert v enthält, so dass (Taste == null k == null: key.equals (k)), dann gibt diese Methode v zurück; Andernfalls wird null zurückgegeben. (Es kann höchstens ein solches Mapping geben.)
Ist das ein Fehler? Fehle ich hier etwas? Ich benutze Java Version 1.8.0_92, die ich über Homebrew installiert habe.
EDIT: Diese Frage als Duplikat dieser other question markiert wurde, aber ich werde diese Frage lassen wie es ist, weil es eine scheinbare Unvereinbarkeit mit equals()
identifiziert, während die andere Frage der Fehler übernimmt mit hashCode()
liegt. Hoffentlich macht das Vorhandensein dieser Frage das Problem leichter durchsuchbar.
Versuchen Hinzufügen '@ Override' zu' equals' und 'hashCode' Methoden (immer eine Best Practice) und sehen, ob Sie irgendwelche hilfreiche Informationen erhalten. – chrylis
Um diese Art von Tippfehlern oder Fehlern in Zukunft zuzulassen, lassen Sie Ihre IDE immer die Methoden für Sie generieren. Dann zwicke sie, damit sie so aussehen, wie du es willst. Dies hätte die richtigen Methoden mit '@ Override'-Annotationen erzeugt. – Magnilex