Передача аргументов в метод в другом порядке не меняет результат

Не понимаю как такое получается:

    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 шт):

Автор решения: Sergey Popov

"Магия" состоит в том, что в момент создания объекта Object его хэш-код ещё не определён. Базовая реализация метода hashCode() является нативной функцией, которая генерирует хэш-код при первом вызове. Полученное значение кэшируется и возвращается при последующих вызовах метода hashCode().

Другими словами, хэш-коды объектов o1 и o2 определяются в момент вычисления выражения o1.hashcode() < o2.hashcode(), что и приводит к неоднозначности. Но если перед вызовами метода method() добавить, например, строку o1.hashCode();

то ситуация стабилизируется и оба последующих вызова метода method() дадут ожидаемо противоположные результаты.

Подробнее здесь: https://habr.com/ru/company/mailru/blog/321306/

→ Ссылка