Не понимаю как такое получается:
main:
Object o1 = new Object();
Object o2 = new Object();
method(o1, o2); //*или (o2, o1),всегда true, а если добавим ещё вызов метода:*//
method(o2, o1); // то здесь уже false, почему так?
boolean method(Object o1, Object o2) {
return o1.hashcode() < o2.hashcode();
}
Сергей Попов
41 уровень
что за магия...
Решен
Комментарии (1)
- популярные
- новые
- старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Павел Безумный учёный Expert
17 сентября 2021, 22:16решение
"Магия" состоит в том, что в момент создания объекта Object его хэш-код ещё не определён. Базовая реализация метода hashCode() является нативной функцией, которая генерирует хэш-код при первом вызове. Полученное значение кэшируется и возвращается при последующих вызовах метода hashCode().
Другими словами, хэш-коды объектов o1 и o2 определяются в момент вычисления выражения o1.hashcode() < o2.hashcode(), что и приводит к неоднозначности. Но если перед вызовами метода method() добавить, например, строку
Хабр
то ситуация стабилизируется и оба последующих вызова метода method() дадут ожидаемо противоположные результаты.
Подробнее здесь: +3