2015-07-04 2 views
2

Рассмотрит часть программы: - методJava HashMap - как получить оба элемент

HashMap<Object,Object> m1=new HashMap<Object,Object>(); 
Person p1=new Person("Raj","Sharma"); 
Person p2=new Person("Raj","Sharma"); 
m1.put(p1,"11"); 
m1.put(p2,"22"); 

Также Person класс заменяет хэш-код(), но не равный() метод

Что я знаете, что: поскольку обе имеют одинаковые ключи (p1 и p2 выдают один и тот же хэш-код), и, следовательно, они соответствуют одному и тому же индексу, поэтому после сохранения p1 в этом индексе, когда он пытается поставить p2 JVM, убедитесь, что оба имеют одинаковый хэш-код, поэтому снова хеширование сделано на p2, и создается новый индекс, и 22 получает этот индекс.

Теперь, если мы попытаемся извлечь элемент, используя клавишу Р1 или Р2,

String temp=(String)m1.get(p1);  // 11 

вернет 11 только то, как мы можем извлечь элемент 22 ??

+0

P1 заменен на p2. Поэтому, когда вы получаете значение для этого. Это будет самое новое значение, которое помещено на карту – Krit

+0

нет метода равенства в классе person, поэтому ключи p1 и p2 получат разные индексы ... – Ronaldo7

ответ

2

Если ваш класс Person перекрывает как хэш-код и равен, так что p1.equals(p2) верно и p1.hashCode()==p2.hashCode(), вы не можете получить как «11» и «22» на карте, так как HashMap не позволяет дублировать ключи.

Поэтому m1.put(p2,"22"); заменит значение «11» на «22». В этом случае оба m1.get(p1) и m1.get(p2) вернут «22».

Также Person класс заменяете метод хэш-код(), но не равно() метод

я пропустил эту фразу. Если вы не переопределяете equals, p1 и p2 не являются тем же самым ключом, даже если они имеют одинаковый хэш-код. m1.get(p1) вернется «11», а m1.get(p2) вернется «22».

+0

У меня есть сомнения в последней строке, которую вы сказали .. >>> m1.get (p2) вернется «22», но почему? p1 и p2 имеют одно и то же значение hashCode(), то почему это вернет 22, он должен вернуться 11, я думаю, – Ronaldo7

+0

@ Ronaldo7 Если оба ключа имеют одинаковый хэш-код, они будут помещены в одно и то же ведро Карты. HashMap будет различать два, используя 'equals' (поскольку вы не переопределили' equals', p1 не равно p2). – Eran

+0

может ведро, имеющее индекс, может хранить два объекта. – Ronaldo7

1

Вам также необходимо переопределить метод equals Person. При попытке извлечь значение hashcode будет использоваться для расчета того, какое ведро для поиска находится, но тогда метод equals будет использоваться для проверки того, соответствует ли пройденный ключ ключевым словам, в отношении которых хранится значение.

При работе с наборами, основанными на хешах, необходимо переопределить значения equals и hashcode в Java. Здесь, пожалуйста, обратитесь к основному контракту.

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

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