Ответ 1
Вам нужно реализовать hashCode
и equals
на Key
. реализация по умолчанию этих методов просто проверяет равенство экземпляра (другими словами, два Object
будут равны, если они фактически являются одним и тем же объектом).
У меня есть hasmap с ключевым объектом,
HashMap<Key, Object> test;
и введите новый ключ ( "тот же" ) в качестве ключа.
так что вроде..:
test.put(new Key("the same"), someObject);
(без сохранения этого ключа в переменной)
поэтому.. через некоторое время... я хочу получить доступ к хэшмапу, потому что у меня нет объекта, я попытался создать новый ключ ( "тот же" ) и сделать его ключевым. Но он не работал.
Как заставить его работать? (без сохранения первого ключа "объекта" в переменной)
Итак, пока что im использует объект String в качестве ключа.
HashMap<String, Object>
Вам нужно реализовать hashCode
и equals
на Key
. реализация по умолчанию этих методов просто проверяет равенство экземпляра (другими словами, два Object
будут равны, если они фактически являются одним и тем же объектом).
Вероятно, ваша проблема не соответствует Key
hashCode()
и equals()
(или вообще). Для использования в качестве ключа HashMap
класс должен реализовать эти два метода, чтобы отразить "равенство" двух объектов.
Если вы создаете два разных экземпляра с помощью
Key a = new Key("xyz");
Key b = new Key("xyz");
и ожидайте, что они будут равны и будут работать в HashMap
, вы должны переопределить hashCode()
, чтобы он возвращал одно и то же значение в обоих экземплярах, а equals()
возвращает true при их сравнении.
Если идентификатор объекта основан на строковом значении, то
@Override
public int hashCode()
{
return theStringValue.hashCode();
}
и
@Override
public boolean equals(Object o)
{
return this.theStringValue.equals(o);
}
должен работать
Если класс не переопределяет методы equals()
или hashCode()
, вместо него используются реализации по умолчанию, найденные в классе Object
. В частности, equals()
просто выполняет проверку ссылочного равенства.
Это сразу объясняет, почему ваш подход не работает: новый объект Key
явно не относится к старому объекту Key
.
Если вы хотите указать новый экземпляр с тем же свойством, вы должны переопределить метод equals()
с реализацией, которая соответствует вашим критериям для равенства ключей. Вы также должны переопределить hashCode()
, чтобы полностью контролировать процесс сравнения ключей.