Здравствуйте, Adopt, Вы писали:
A>и вообще зачем нужен этот hashCode() ведь hash таблица насколько A>понимаю это всего лишь контейнер, а о какой таблице идет речь здесь?
Насколько я понимаю, hash таблица это ассоциативный набор данных
Здравствуйте, Adopt, Вы писали:
A>Почему когда нужно переопределить equals нужно также A>переделать и hashCode()
A>и вообще зачем нужен этот hashCode() ведь hash таблица насколько A>понимаю это всего лишь контейнер, а о какой таблице идет речь здесь?
hashCode() необходим для работы хэш-таблицы. Исключительно для этого он и внесен в интерфейс всех объектов.
А переделывать оба метода нужно для сохранения основного свойства хэш-функции:
A == B --> hash(A) == hash(B)
Если это не сделать, то хэш-таблица может перестать корректно работать с данными объектами.
Здравствуйте, Cider, Вы писали:
C>Здравствуйте, Adopt, Вы писали:
A>>Почему когда нужно переопределить equals нужно также A>>переделать и hashCode()
A>>и вообще зачем нужен этот hashCode() ведь hash таблица насколько A>>понимаю это всего лишь контейнер, а о какой таблице идет речь здесь?
C>hashCode() необходим для работы хэш-таблицы. Исключительно для этого он и внесен в интерфейс всех объектов. C>А переделывать оба метода нужно для сохранения основного свойства хэш-функции: C>A == B --> hash(A) == hash(B) C>Если это не сделать, то хэш-таблица может перестать корректно работать с данными объектами.
спасибо приведите пожалуйста пример
работы с equal то есть с ее переопределением и hashCode
Здравствуйте, Cider, Вы писали:
C>Здравствуйте, Adopt, Вы писали:
A>>Почему когда нужно переопределить equals нужно также A>>переделать и hashCode()
A>>и вообще зачем нужен этот hashCode() ведь hash таблица насколько A>>понимаю это всего лишь контейнер, а о какой таблице идет речь здесь?
C>hashCode() необходим для работы хэш-таблицы. Исключительно для этого он и внесен в интерфейс всех объектов. C>А переделывать оба метода нужно для сохранения основного свойства хэш-функции: C>A == B --> hash(A) == hash(B) C>Если это не сделать, то хэш-таблица может перестать корректно работать с данными объектами.
Не совсем верное условие:
a.equals(b) — true --> a.hashCode == b.hashCode — true
Иначе теряется смысл введения хешкода.
Метод public int hashCode() возвращает хеш-код (hash code) для объекта. Хеш-код – это целое число, которое сопоставляется с данным объектом. Оно позволяет организовать хранение набора объектов с возможностью быстрой выборки (стандартная реализация такого механизма присутствует в Java и будет описана в следующей лекции).
Для этого метода также принят ряд соглашений, которым стоит следовать при переопределении:
— если два объекта идентичны, то есть вызов метода equals(Object) возвращает true, то вызов метода hashCode() у каждого из этих двух объектов должен возвращать одно и то же значение;
— во время одного запуска программы для одного объекта при вызове метода hashCode() должно возвращаться одно и то же значение, если между этими вызовами не были затронуты данные, используемые для проверки объектов на идентичность в методе equals(). Это число не обязательно должно быть одним и тем же при повторном запуске той же программы, даже если все данные будут идентичны.
В классе Object этот метод реализован на уровне JVM. Сама виртуальная машина генерирует хеш-код, основываясь на расположении объекта в памяти. Это позволяет для различных объектов (неравенство по ссылке) получать различные хеш-коды.
В силу первого соглашения при переопределении метода equals() необходимо переопределить также метод hashCode(). При этом нужно стремиться, во-первых, к тому, чтобы метод возвращал значение как можно быстрее, иначе основная цель – быстрая выборка – не будет достигнута. Во-вторых, желательно для различных объектов, то есть метод equals(Object) возвращает false, генерировать различные хеш-коды. В этом случае хеш-таблицы будут работать особенно эффективно. Однако, понятно, что это не всегда возможно. Диапазон значений int – 232, а количество различных строк, или двумерных точек, с координатами типа int – заведомо больше.
Большинство стандартных классов переопределяет этот метод, строго следуя всем соглашениям.
Здравствуйте, fefelov, Вы писали:
F>Здравствуйте, Adopt, Вы писали:
A>>а как должен быть переопределен hashCode в данном примере?
F>По поводу хешей лучше всего — почитать Кнута.
Здравствуйте, fefelov, Вы писали:
F>Здравствуйте, Adopt, Вы писали:
A>>а как должен быть переопределен hashCode в данном примере?
F>Есть ли ограничения на величины sideA и sideB?
Здравствуйте, fefelov, Вы писали:
F>Здравствуйте, Adopt, Вы писали:
F>>>Есть ли ограничения на величины sideA и sideB? A>>нет,
F>Получить один int из двух int — не так-то просто. Нужны детали...
Какие детали ведь это просто Rectangle?
ладно путь это не прямоугольник а Point...
ведь ничего не измениться но что конкретно надо делать?
pulic class Rectangle
{
public int width;
public int height;
public int hashCode()
{
// что здесь писать???
}
public boolean equals(Object obj)
{
// тут все ясно
}
}