2013-10-03 5 views
1

Я пытаюсь использовать HashMap с классом Cell в качестве ключа. Однако после помещения элемента в HashMap вызов, содержащийся в элементе, вернет false.HashMap не возвращает значения на основе ключа

public static void main(String args[]) { 
     HashMap<Cell, String> map = new HashMap<Cell, String>(); 
     map.put(new Cell(0,0), "Bob"); 
     System.out.println(map.containsKey(new Cell(0,0))); 
     System.out.println(new Cell(0,0).equals(new Cell(0,0))); 
} 

Это печатает ложь и правда, где он должен печатать верно и верно, так как в соответствии с картой документы ContainsKey использует .equals(). Что я делаю не так?

+10

Вам необходимо правильно реализовать 'хэш-код()' а. –

+0

или не использовать equals, hashCode вообще. Если вы переопределите equals, вы также должны реализовать hashCode – Anton

+1

Если вы не переопределите 'hashCode()', тогда он просто будет использовать метод Object по умолчанию, поэтому они разные для каждого объекта, несмотря на одинаковые значения. –

ответ

3

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

Вы создали два отдельных объекта с двумя отдельными адресами. Без этих методов JVM не может знать, что объекты «одинаковы».

См http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#hashCode()

1

Рассмотрите, как реализован HashMap. Когда он ставится, он сначала вычисляет объект hashCode(), чтобы выяснить, в каком ведре разместить объект. Когда он пытается извлечь объект, он снова получает свой hashCode(), идентифицирует целевой таргетку, проходит через связанный список в ведро, вызывая equals() против каждого объекта. Он возвращает, если находит совпадение.

Другими словами, если вы используете HashMap, вам необходимо иметь правильную и соответствующую реализацию equals() и hashCode().

По умолчанию hashCode() метод, унаследованный от Object, неверно возвращает тот же hashCode(), если ссылки на объекты не совпадают. В вашем случае это не так.

0

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

0

Возможно, вы забыли реализовать функцию hashcode() для Cell, что также необходимо для использования определенного пользователем класса в HashMap. Вот простой и вообще точный способ реализовать hashcode() функцию:

int hashcode(){ 
    return (field1.toString()+field2.toString()+...+fieldN.toString()).hashcode(); 
} 

Где field1 к fieldN являются поля в классе. Если поля являются примитивами (то есть int), просто достаньте toString().

Смежные вопросы