Передача аргументов в метод в другом порядке не меняет результат
Не понимаю как такое получается:
public class Main {
public static void main(String[] args) {
Object o1 = new Object();
Object o2 = new Object();
System.out.println(method(o1, o2));
}
private static boolean method(Object o1, Object o2) {
return o1.hashCode() < o2.hashCode();
}
}
//вывод: true
public class Main {
public static void main(String[] args) {
Object o1 = new Object();
Object o2 = new Object();
System.out.println(method(o2, o1));
}
private static boolean method(Object o1, Object o2) {
return o1.hashCode() < o2.hashCode();
}
}
//вывод: true
public class Main {
public static void main(String[] args) {
Object o1 = new Object();
Object o2 = new Object();
System.out.println(method(o1, o2));
System.out.println(method(o2, o1));
}
private static boolean method(Object o1, Object o2) {
return o1.hashCode() < o2.hashCode();
}
}
//* вывод: true false
Почему первые два кода результат одинаковый, а третий разный?
Ответы (1 шт):
"Магия" состоит в том, что в момент создания объекта Object его хэш-код ещё не определён. Базовая реализация метода hashCode() является нативной функцией, которая генерирует хэш-код при первом вызове. Полученное значение кэшируется и возвращается при последующих вызовах метода hashCode().
Другими словами, хэш-коды объектов o1 и o2 определяются в момент вычисления выражения o1.hashcode() < o2.hashcode(), что и приводит к неоднозначности. Но если перед вызовами метода method() добавить, например, строку o1.hashCode();
то ситуация стабилизируется и оба последующих вызова метода method() дадут ожидаемо противоположные результаты.
Подробнее здесь: https://habr.com/ru/company/mailru/blog/321306/