Wydaje się, że otrzymuję zduplikowane klucze w standardowej Java HashMap. Przez "duplikat" rozumiem, że klucze są równe ich metodzie equals()
. Oto kod problematyczne:Dlaczego otrzymuję zduplikowane klucze w 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));
}
}
A oto Wynikiem:
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
Jak widać, metoda equals()
na dwóch User
obiektów wraca true
i ich kody hash są takie same , ale każdy z nich tworzy odrębną key
w map
. Ponadto map
nadal rozróżnia dwa klucze User
w ostatnich czterech połączeniach get()
.
to bezpośrednio zaprzecza documentation:
Bardziej formalnie, czy ta mapa zawiera mapowania z klucza k do wartości v takie, że (key == null k == null? Key.equals (k)), wówczas ta metoda zwraca v; w przeciwnym razie zwraca wartość null. (Może być co najwyżej jedno takie mapowanie.)
Czy to błąd? Czy coś mi umyka? Używam wersji Java 1.8.0_92, którą zainstalowałem przez Homebrew.
EDIT: To pytanie zostało oznaczone jako duplikat tego other question, ale zostawię to pytanie jak to jest, ponieważ identyfikuje pozorną niespójność z equals()
, natomiast inne pytanie zakłada, że błąd leży po hashCode()
. Mam nadzieję, że obecność tego pytania sprawi, że ten problem będzie łatwiejszy do przeszukiwania.
spróbuj dodać '@ Override' do' equals' oraz metody 'hashCode' (zawsze najlepsza praktyka) i zobacz, czy uzyskasz przydatne informacje. – chrylis
Aby pozwolić na ten rodzaj literówek lub błędów w przyszłości, pozwól, aby twoje IDE generowało metody dla ciebie. Następnie dostosuj je, aby wyglądały tak, jak chcesz. W ten sposób powstałyby poprawne metody z adnotacjami "@ Override". – Magnilex