Это простой вопрос о java.HashMap способ делать содержитKey не ведет себя как ожидалось
Сегодня я занимался поиском пути, когда мне пришлось использовать , чтобы найти класс Coord
в другом keySet()
от Coord
. Я обнаружил, что когда я использовал готовый метод containsKey()
, он просто не работал так, как я хотел. Я сделал тест, чтобы выяснить, что происходит и здесь:
HashMap<Coord, Coord> test = new HashMap<Coord, Coord>();
test.put(new Coord(3, 3), new Coord(0, 0));
System.out.println("HashMap test for containsKey : " + test.containsKey(new Coord(3, 3)));
boolean containsKey = false;
for(Coord a : test.keySet())
{
if(a.equals(new Coord(3, 3)))
{
containsKey = true;
}
}
System.out.println("My test for containsKey : "+containsKey);
И удивительно, вот что я нашел:
HashMap test for containsKey : false
My test for containsKey : true
Я просто хотел бы знать, что происходит и почему.
Кроме того, здесь есть Coord
класс:
public class Coord
{
public float x, y;
public Coord(float a, float b)
{
this.x = a;
this.y = b;
}
@Override
public boolean equals(Object b)
{
if(b instanceof Coord)
{
Coord casted = (Coord) b;
return casted.x == x && casted.y == y;
}
return false;
}
}
Прежде всего вы проверяете метод 'equals()'. вы не переопределили метод hashCode(). а также вы можете проверить код метода 'containsKey()'. он делает гораздо больше, чем вы ожидаете. Вы должны переопределить метод hashCode()! – Prashant
Ну, я просто посмотрел на него и сделал третий тест с помощью простого test.get (new Coord (3, 3))! = Null ... И он вернул false. Я смотрю на код, чтобы понять, почему. –
лучше вы можете проверить 'final Entry метод getEntry (Object key)'. –
Prashant