Подтвердить что ты не робот

Использование экземпляра объекта в качестве ключа в hashmap, а затем доступ к нему с точно новым объектом?

У меня есть hasmap с ключевым объектом,

HashMap<Key, Object> test;

и введите новый ключ ( "тот же" ) в качестве ключа.

так что вроде..:

test.put(new Key("the same"), someObject);

(без сохранения этого ключа в переменной)

поэтому.. через некоторое время... я хочу получить доступ к хэшмапу, потому что у меня нет объекта, я попытался создать новый ключ ( "тот же" ) и сделать его ключевым. Но он не работал.

Как заставить его работать? (без сохранения первого ключа "объекта" в переменной)

Итак, пока что im использует объект String в качестве ключа.

HashMap<String, Object>
4b9b3361

Ответ 1

Вам нужно реализовать hashCode и equals на Key. реализация по умолчанию этих методов просто проверяет равенство экземпляра (другими словами, два Object будут равны, если они фактически являются одним и тем же объектом).

Дальнейшее чтение

Эффективные Java - методы, общие для всех объектов

Ответ 2

Вероятно, ваша проблема не соответствует 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);
}

должен работать

Ответ 3

Если класс не переопределяет методы equals() или hashCode(), вместо него используются реализации по умолчанию, найденные в классе Object. В частности, equals() просто выполняет проверку ссылочного равенства.

Это сразу объясняет, почему ваш подход не работает: новый объект Key явно не относится к старому объекту Key.

Если вы хотите указать новый экземпляр с тем же свойством, вы должны переопределить метод equals() с реализацией, которая соответствует вашим критериям для равенства ключей. Вы также должны переопределить hashCode(), чтобы полностью контролировать процесс сравнения ключей.