Я готовлю сертификацию 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 для каждого из двух объектов должен производить различные целочисленные результаты. Тем не менее, программист должен знать, что получение отдельных целых результатов для неравных объектов может улучшить производительность хеш-таблиц.
Соответственно, согласно первому из этих правил, следует ли ожидать такого поведения?
Tnx, в основном я переусердствовал вопрос :( – dierre