2014-01-16 3 views
1

Я готовлю сертификацию java, видимо, я не мог правильно ответить на этот ответ.Как правильно использовать метод hashcode?

Дано:

2. class Chilis { 
3.  Chilis(String c, int h) { color = c; hotness = h; } 
4.  String color; 
5.  private int hotness; 
6.  public boolean equals(Object o) { 
7.   Chilis c = (Chilis)o; 
8.   if(color.equals(c.color) && (hotness == c.hotness)) return true; 
9.   return false; 
10.  } 
11. // insert code here 
12. } 

Который, вставленный независимо друг от друга на линии 11, выполнить Equals() и Hashcode) договор (для Chilis? (Выберите все применимые.)

  • A. public int hashCode() {return 7; }
  • B. public int hashCode() {return hotness; }
  • C. public int hashCode() {return color.length(); }
  • D. public int hashCode() {return (int) (Math.random() * 200); }
  • E. public int hashCode() {return (color.length() + hotness); }

В книге говорится:

A, B, C, and E are correct. They all guarantee that two objects that equals() says are 
equal, will return the same integer from hashCode(). The fact that hotness is private 
has no bearing on the legality or effectiveness of the hashCode() method. 

Теперь я получил право А и В, но не C и E, потому что это не звучит правильно для меня. Посмотрите на следующий пример:

Under c = new Under("ciao", 9); 
Map<Under, String> map = new HashMap<Under, String>(); 

map.put(c, "ciao"); 
System.out.println(map.get(c)); 
c.color = "uauauauauau"; 

System.out.println(map.get(c)); 

И выход будет:

ciao 
null 

И я сказал, что на основе модификатора доступа цвета. В документации класса объектов мы имеем контракт:

  • Всякий раз, когда он вызывается на одном объекте более чем один раз в ходе выполнения приложения Java, метод хэш-код должен последовательно возвращать то же самое число, не предусмотрено никакой информации используется при равных сравнениях на объекте. Это целое число не должно оставаться согласованным с одним исполнением приложения на другое выполнение одного и того же приложения.
  • Если два объекта равны в соответствии с методом equals (Object), то вызов метода hashCode для каждого из двух объектов должен давать одинаковый целочисленный результат.
  • Не требуется, чтобы, если два объекта неравны в соответствии с методом equals (java.lang.Object), то вызов метода hashCode для каждого из двух объектов должен производить различные целочисленные результаты. Тем не менее, программист должен знать, что получение отдельных целых результатов для неравных объектов может улучшить производительность хеш-таблиц.

Соответственно, согласно первому из этих правил, следует ли ожидать такого поведения?

ответ

4

Из документации вы цитируемой:

Всякий раз, когда он вызывается на одном объекте более чем один раз в течение выполнения приложения Java, метод hashCode должен последовательно возвращать одно и то же целое число, при условии, что информация, используемая при равных сравнениях на объекте, не изменяется. Это целое число не должно оставаться согласованным с одним исполнением приложения на другое выполнение одного и того же приложения.

Так что это ожидаемое поведение. Если equals и hashCode используют изменяемые поля, и вы помещаете затронутый объект в HashMap, а значения меняются, тогда все ставки отключены.

+1

Tnx, в основном я переусердствовал вопрос :( – dierre

2

Обычно хеш-код не должен меняться во время жизни объекта, поэтому он должен использовать конечные поля.Поскольку цвет может быть изменен во время выполнения его should't используется в хэш-код или равна

2

Всякий раз, когда он вызывается на одном объекте более чем один раз в течение выполнения приложения Java, метод хэш-код должен последовательно возвращать одинаковое число, не представили никакой информации, используемой в приравнивает сравнения на объекте изменяется.

Это еще один способ сказать, что если информация, используемая при равных сравнениях, будет изменена, то hascode может отличаться. Это то, что происходит в C и E.

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