равно и hashCode - PullRequest
       8

равно и hashCode

1 голос
/ 05 августа 2010

Я сталкиваюсь с вопросом о контрактах equals и hashCode: здесь это

Дано:

class SortOf { 
  String name; 
  int bal; 
  String code; 
  short rate; 
  public int hashCode() { 
    return (code.length() * bal); 
  } 
  public boolean equals(Object o) { 
    // insert code here 
  } 
} 

Что из следующего выполнит контракты equals () и hashCode ()для этого класса?(Выберите все подходящие варианты.)

Правильный ответ C:

return ((SortOf)o).code.length() * ((SortOf)o).bal  ==  this.code.length() * 
    this.bal; 

D:

return ((SortOf)o).code.length() * ((SortOf)o).bal * ((SortOf)o).rate ==
    this.code.length() * this.bal * this.rate; 

У меня есть вопрос о последнем выборе D, скажите, еслидва объекта

A: длина кода = 10, бал = 10, скорость = 100

B: длина кода = 10, бал = 100, скорость = 10

Затем, используя метод equals() в D, мы получим A.equals(B) с оценкой true, верно?Но тогда они получают другой хэш-код, потому что у них разные балансы?Это то, что я где-то неправильно понял концепцию?Может кто-нибудь уточнить это для меня?

Ответы [ 5 ]

4 голосов
/ 05 августа 2010

Вы правы - из-за этого D неуместен.

В более общем смысле, hashCode и equals должны в основном учитывать одни и те же поля, одинаково.Конечно, для начала это очень странная реализация equals - обычно вы должны проверять равенство между каждым из полей.В некоторых случаях поля могут быть взаимосвязаны таким образом, чтобы можно было умножать и т. Д., Но я не ожидаю, что это будет включать длину строки ...

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

0 голосов
/ 13 марта 2018
  1. Метод hashCode () используется для получения уникального целого числа для данного объекта.Это целое число используется для определения местоположения сегмента, когда этот объект необходимо сохранить в некоторой HashTable, такой как структура данных HashMap.Но по умолчанию метод Object hashCode () возвращает целое число для представления адреса в памяти, где хранится объект.

  2. Метод equals (), как следует из названия, используется для простой проверки равенства двухобъекты.Реализация по умолчанию просто проверяет ссылки на объекты двух объектов, чтобы проверить их равенство.

равные объекты должны иметь одинаковые хеш-коды.

equals () должен определить отношение равенства.если объекты не изменены, то он должен продолжать возвращать одно и то же значение.o.equals (null) всегда должен возвращать false.

hashCode () также должен быть непротиворечивым, если объект не изменен в терминах equals (), он должен продолжать возвращать то же значение.

Соотношение между этими двумя методами:

всякий раз, когда a.equals (b) тогда a.hashCode () должен совпадать с b.hashCode ().

относится к: https://howtodoinjava.com/interview-questions/core-java-interview-questions-series-part-1/

0 голосов
/ 18 июля 2014

В общем, вы должны всегда переопределять один, если вы переопределяете другой в классе.Если вы этого не сделаете, вы можете столкнуться с проблемами, когда этот класс используется в hashmaps / hashtables и т. Д.

0 голосов
/ 27 февраля 2014

Это все о выполнении контракта (что касается этого вопроса).Разная реализация (с hasCode и равными) имеет разные ограничения и свои преимущества - поэтому разработчик должен проверить это.

но тогда они получат другой hashCode, потому что у них другой баланс? Именно так!Но именно поэтому вы должны выбрать вариант С. Вопрос хочет проверить ваше понимание того, что выполняет концепцию контракта , а не какой хэскод будет лучше для сценария.

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

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

0 голосов
/ 05 августа 2010

Вы должны проверить по крайней мере все поля, используемые .hashCode(), чтобы объекты, которые равны, имели одинаковый хэш. Но вы можете проверить больше полей в равных, вполне нормально иметь разные объекты с одинаковым хешем. Кажется, вы делаете SCJP 1.6? Эта тема хорошо освещена в книге SCJP 1.6 от Кэтрин Сьерра и Берт Бейтс.

Примечание: поэтому вполне допустимо реализовать полезное .equals() при возврате постоянного значения из .hashCode()

...