Согласно официальной документации для класса Java Hashtable (https://docs.oracle.com/javase/7/docs/api/java/util/Hashtable.html), операция get() вернет одно из записанных значений, если указанное значение имеет ключ, который возвращает true, если параметр подается в opals() equals этого ключа.Операция Hashtable get() не работает согласно документации
Итак, теоретически следующий код должен возвращать «Hello!» для обоих ГЭТ Хеш (в) запросы:
public static class Coordinates implements Serializable {
private int ex;
private int why;
public Coordinates(int xCo, int yCo) {
ex = xCo;
why = yCo;
}
public final int x() {
return ex;
}
public final int y() {
return why;
}
public boolean equals(Object o) {
if(o == null) {
return false;
} else if(o instanceof Coordinates) {
Coordinates c = (Coordinates) o;
return this.x() == c.x() && this.y() == c.y();
} else {
return false;
}
}
}
Hashtable<Coordinates, String> testTable = new Hashtable<Coordinates, String>();
Coordinates testKey = new Coordinates(3, 1);
testTable.put(testKey, "Hello!");
testTable.get(testKey); //This will return the "Hello" String as expected.
testTable.get(new Coordinates(3, 1)); //This will only return a null value.
Однако, получить() не работает, как это предполагается. Кажется, что он работает, только если вы переполняете его точно таким же объектом, как и исходный ключ.
Есть ли способ исправить это и заставить Hashtable функционировать так, как описано в документации? Нужно ли вносить какие-либо коррективы в пользовательскую equals() opperation в классе Coordinates?
С документация: 'Чтобы успешно хранить и извлекать объекты из хеш-таблицы, объекты, используемые в качестве ключей, должны реализовывать метод hashCode и метод equals.« Вы также должны переопределить метод hashCode. –
И если объекты равны, то их значение hashCode должно быть равно. – ntalbs
Можете ли вы включить реализацию для 'hashCode()'? BTW Ваша IDE сможет генерировать 'hashCode()' и 'equals (Object)' для вас. –