Я играю с HashMaps на Java, и я наткнулся на то, что я не могу понять. Я тоже не могу найти дубликат моей проблемы.HashMap - не возвращает правильное значение для равных ключей
Я пытаюсь создать карту с ключом VertexPair
и значением Integer
. VertexPair
- это просто контейнер для 2 Vertex
объектов. Когда я создаю 2 VertexPairs
, которые имеют одинаковый хеш-код и равны (проверены .equals()), они не возвращают одно и то же значение с моей карты.
Вот мой код:
HashMap<VertexPair, Integer> edges = new HashMap<VertexPair, Integer>();
Vertex a = new Vertex("A");
Vertex b = new Vertex("B");
VertexPair p = new VertexPair(a, b);
VertexPair m = new VertexPair(a, b);
VertexPair n = new VertexPair(b, a);
VertexPair check = new VertexPair(a, new Vertex("C"));
System.out.println(p.equals(m));
System.out.println(p.equals(n));
System.out.println(m.equals(n));
//just to be sure equals is working
System.out.println(p.equals(check));
System.out.println(m.hashCode());
System.out.println(n.hashCode());
System.out.println(p.hashCode());
//just to be sure hashCode is working
System.out.println(check.hashCode());
edges.put(p, 10);
System.out.println(edges.get(p));
System.out.println(edges.get(m));
System.out.println(edges.get(n));
И это выход:
true
true
true
false
1757285723
1757285723
1757285723
-425440240
10
null
null
Вот класс VertexPair по запросу:
public final class VertexPair {
private HashSet<Vertex> set;
public VertexPair(Vertex a, Vertex b) {
if(a==null || b==null)
throw new NullPointerException("Vertexes must not be null");
set = new HashSet<Vertex>();
set.add(a);
set.add(b);
}
public HashSet<Vertex> getVertexes() {
return set;
}
@Override
public int hashCode() {
return set.hashCode();
}
public boolean equals(VertexPair p) {
if(!(p instanceof VertexPair))
return false;
if(p==this)
return true;
return set.equals(p.getVertexes());
}
}
Может кто-то пожалуйста, объясните мне, что происходит на? Должно быть, я неправильно понимаю что-то важное в HashMaps. Заранее спасибо :)