Java. Одни и те же объекты с разными хэшами

#java

#java

Вопрос:

У меня есть два объекта из базы данных (в базе данных это один и тот же объект), но у них разные хэши:

 GroupType groupType  = groupTypeDao.findById(3);
GroupType groupType1 = groupTypeDao.findById(3);
System.out.println(groupType);
System.out.println(groupType1);
  

Я получаю этот вывод:

 GroupType@6040
GroupType@6041
  

Почему это так? Технологический стек: Spring, JavaFX, Hibernate.

У меня есть еще один проект с Spring и Hibernate. Файлы конфигурации идентичны в двух проектах. Версия гибернации также идентична. Но в другом проекте это приводит к одинаковым хэш-кодам.

Комментарии:

1. Это не те HashCodes

2. Сделайте: groupType.hashCode() и groupType1.hashCode() и посмотрите, что вы получите…

3. Это toString значения, которые используются по умолчанию hashCode() … Что вы, вероятно, не реализовали.

4. То, что вы видите, — это хэш-код идентификатора , оформленный в виде строки. Посмотрите java.lang.Object#toString() исходный код того, что вы получаете.

5. Я пытаюсь программно выбрать строку в TableView. Я сохраняю объект в базе данных, загружаю фрейм с помощью TableView, получаю список всех объектов из базы данных и помещаю его в TableView следующим образом: tableView.setItems(list); Затем я пытаюсь выбрать этот объект и сфокусировать его. tableView.getSelectionModel().select(object) . Но объект не найден в списке, потому что у него другой хэш-код. Строка не выделена, не выделена.

Ответ №1:

То, что вы напечатали, — это ссылки на объекты. Они действительно разные, если вы создали каждую ссылку, вызвав new .

Вам нужно переопределить equals , hashCode и toString в соответствии с «Эффективной Java», чтобы получить желаемое поведение.

Ответ №2:

System.out.println(groupType) обычно вызывает toString() метод на java.lang.Объект и это печатает:

getClass().getName() ‘@’ Integer.toHexString(хэш-код())

Теперь hashCode() это может немного вводить в заблуждение, потому что, если оно не будет перезаписано…

метод hashCode, определенный class Object, возвращает разные целые числа для разных объектов.

Цитаты из java.lang.Документация объекта.