equal
От: Adopt  
Дата: 01.04.05 00:43
Оценка:
Почему когда нужно переопределить equals нужно также
переделать и hashCode()

и вообще зачем нужен этот hashCode() ведь hash таблица насколько
понимаю это всего лишь контейнер, а о какой таблице идет речь здесь?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re: hashset
От: Суслик Россия http://www.vkkb.ru
Дата: 01.04.05 07:39
Оценка:
Здравствуйте, Adopt, Вы писали:

A>и вообще зачем нужен этот hashCode() ведь hash таблица насколько

A>понимаю это всего лишь контейнер, а о какой таблице идет речь здесь?

Насколько я понимаю, hash таблица это ассоциативный набор данных
Re[2]: hashset
От: Суслик Россия http://www.vkkb.ru
Дата: 01.04.05 07:42
Оценка:
Здравствуйте, Суслик, Вы писали:

А ваще, хоть и первое апреля, а не смешно кнопки менять местами Недописал я в прошлый раз

См. класс HashSet и HashMap, там видно, зачем hashCode нужен и как он используется.
Re: equal
От: Cider Россия  
Дата: 01.04.05 11:20
Оценка:
Здравствуйте, Adopt, Вы писали:

A>Почему когда нужно переопределить equals нужно также

A>переделать и hashCode()

A>и вообще зачем нужен этот hashCode() ведь hash таблица насколько

A>понимаю это всего лишь контейнер, а о какой таблице идет речь здесь?

hashCode() необходим для работы хэш-таблицы. Исключительно для этого он и внесен в интерфейс всех объектов.
А переделывать оба метода нужно для сохранения основного свойства хэш-функции:
A == B --> hash(A) == hash(B)
Если это не сделать, то хэш-таблица может перестать корректно работать с данными объектами.
Cider
Re[2]: equal
От: Adopt  
Дата: 01.04.05 15:41
Оценка:
Здравствуйте, Cider, Вы писали:

C>Здравствуйте, Adopt, Вы писали:


A>>Почему когда нужно переопределить equals нужно также

A>>переделать и hashCode()

A>>и вообще зачем нужен этот hashCode() ведь hash таблица насколько

A>>понимаю это всего лишь контейнер, а о какой таблице идет речь здесь?

C>hashCode() необходим для работы хэш-таблицы. Исключительно для этого он и внесен в интерфейс всех объектов.

C>А переделывать оба метода нужно для сохранения основного свойства хэш-функции:
C>A == B --> hash(A) == hash(B)
C>Если это не сделать, то хэш-таблица может перестать корректно работать с данными объектами.

спасибо приведите пожалуйста пример
работы с equal то есть с ее переопределением и hashCode
Re[2]: equal
От: Rusher Россия  
Дата: 02.04.05 05:38
Оценка: +1
Здравствуйте, 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
Иначе теряется смысл введения хешкода.
Re[3]: equal
От: Adopt  
Дата: 03.04.05 21:49
Оценка:
Здравствуйте, Rusher, Вы писали:

R>Здравствуйте, Cider, Вы писали:


R>Иначе теряется смысл введения хешкода.


а какой его смысл?
можете разъяснить на пальцах
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[4]: equal
От: fefelov Россия  
Дата: 03.04.05 22:12
Оценка:
здесь:

Метод public int hashCode() возвращает хеш-код (hash code) для объекта. Хеш-код – это целое число, которое сопоставляется с данным объектом. Оно позволяет организовать хранение набора объектов с возможностью быстрой выборки (стандартная реализация такого механизма присутствует в Java и будет описана в следующей лекции).

Для этого метода также принят ряд соглашений, которым стоит следовать при переопределении:
— если два объекта идентичны, то есть вызов метода equals(Object) возвращает true, то вызов метода hashCode() у каждого из этих двух объектов должен возвращать одно и то же значение;
— во время одного запуска программы для одного объекта при вызове метода hashCode() должно возвращаться одно и то же значение, если между этими вызовами не были затронуты данные, используемые для проверки объектов на идентичность в методе equals(). Это число не обязательно должно быть одним и тем же при повторном запуске той же программы, даже если все данные будут идентичны.

В классе Object этот метод реализован на уровне JVM. Сама виртуальная машина генерирует хеш-код, основываясь на расположении объекта в памяти. Это позволяет для различных объектов (неравенство по ссылке) получать различные хеш-коды.

В силу первого соглашения при переопределении метода equals() необходимо переопределить также метод hashCode(). При этом нужно стремиться, во-первых, к тому, чтобы метод возвращал значение как можно быстрее, иначе основная цель – быстрая выборка – не будет достигнута. Во-вторых, желательно для различных объектов, то есть метод equals(Object) возвращает false, генерировать различные хеш-коды. В этом случае хеш-таблицы будут работать особенно эффективно. Однако, понятно, что это не всегда возможно. Диапазон значений int – 232, а количество различных строк, или двумерных точек, с координатами типа int – заведомо больше.

Большинство стандартных классов переопределяет этот метод, строго следуя всем соглашениям.

Re[5]: equal
От: Adopt  
Дата: 03.04.05 22:30
Оценка:
Здравствуйте, fefelov, Вы писали:

F>здесь:


Спасибо за ссылку

package demo.lang;
public class Rectangle {
   public int sideA;
   public int sideB;
   public Rectangle(int x, int y) {
      super();
      sideA = x;
      sideB = y;
   }
   public boolean equals(Object obj) {
      if(!(obj instanceof Rectangle)) 
        return false;
      Rectangle ref = (Rectangle)obj;
      return (((this.sideA==ref.sideA)&&(this.sideB==ref.sideB))||
              (this.sideA==ref.sideB)&&(this.sideB==ref.sideA));
   }
   public static void main(String[] args) {
   }
}



а как должен быть переопределен hashCode в данном примере?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[6]: equal
От: fefelov Россия  
Дата: 03.04.05 22:32
Оценка:
Здравствуйте, Adopt, Вы писали:

A>а как должен быть переопределен hashCode в данном примере?


По поводу хешей лучше всего — почитать Кнута.
Re[7]: equal
От: Adopt  
Дата: 03.04.05 22:34
Оценка:
Здравствуйте, fefelov, Вы писали:

F>Здравствуйте, Adopt, Вы писали:


A>>а как должен быть переопределен hashCode в данном примере?


F>По поводу хешей лучше всего — почитать Кнута.


мне бы хотя бы с этим примером разобраться...
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[8]: equal
От: fefelov Россия  
Дата: 03.04.05 22:36
Оценка:
Здравствуйте, Adopt, Вы писали:

A>мне бы хотя бы с этим примером разобраться...


От общего — к частному...
Re[6]: equal
От: fefelov Россия  
Дата: 03.04.05 22:41
Оценка:
Здравствуйте, Adopt, Вы писали:

A>а как должен быть переопределен hashCode в данном примере?


Есть ли ограничения на величины sideA и sideB?
Re[9]: equal
От: Adopt  
Дата: 03.04.05 22:43
Оценка:
Здравствуйте, fefelov, Вы писали:

F>Здравствуйте, Adopt, Вы писали:


A>>мне бы хотя бы с этим примером разобраться...


F>От общего — к частному...


в смысле?

вопрос: как будет выглядеть переопределение hashCode в случае с Rectangle?
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[7]: equal
От: Adopt  
Дата: 03.04.05 22:44
Оценка:
Здравствуйте, fefelov, Вы писали:

F>Здравствуйте, Adopt, Вы писали:


A>>а как должен быть переопределен hashCode в данном примере?


F>Есть ли ограничения на величины sideA и sideB?


нет,
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[10]: equal
От: fefelov Россия  
Дата: 03.04.05 22:48
Оценка:
Здравствуйте, Adopt, Вы писали:

F>>От общего — к частному...

A>в смысле?

Поняв, что такое есть "хеш-код" вообще, легче будет решить конкретную задачу...
Re[8]: equal
От: fefelov Россия  
Дата: 03.04.05 22:49
Оценка:
Здравствуйте, Adopt, Вы писали:

F>>Есть ли ограничения на величины sideA и sideB?

A>нет,

Получить один int из двух int — не так-то просто. Нужны детали...
Re[9]: equal
От: Adopt  
Дата: 03.04.05 22:57
Оценка:
Здравствуйте, 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)
 {
  // тут все ясно
 }
}
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Re[10]: equal
От: fefelov Россия  
Дата: 03.04.05 23:14
Оценка:
Здравствуйте, Adopt, Вы писали:


public boolean equals(Object obj) {
  if ((obj.sideA == this.sideA) && (obj.sideB == this.sideB)) {
    return true;
  } else {
    return false;
  }
}


А вот насчет
public int hashCode()
нужно подумать.
Re[11]: equal
От: vyxaryx  
Дата: 03.04.05 23:40
Оценка: :)
Например, вот так (не учитывая переполнение)

public int hashcode() {
    return sideA+sideB;
}
... << RSDN@Home 1.1.4 beta 4 rev. 303>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.