Что выведет код Middle ООП и класс Object обновлено

Что выведет: HashSet и класс без hashCode

Вопрос

Что выведет программа (Java 21)? Каждый вывод println с новой строки.

import java.util.*;

public class Main {
    static class P {
        final int x;
        P(int x) { this.x = x; }
        @Override public boolean equals(Object o) {
            return o instanceof P p && p.x == x;
        }
    }
    record R(int x) {}

    public static void main(String[] args) {
        List<P> list = new ArrayList<>(List.of(new P(1)));
        System.out.println(list.contains(new P(1)));
        Set<R> set = new HashSet<>(Set.of(new R(1)));
        System.out.println(set.contains(new R(1)));
        Map<P, String> map = new HashMap<>();
        P key = new P(2);
        map.put(key, "v");
        System.out.println(map.get(key));
    }
}

Попробуйте сами

Напишите, что выведет код: каждый вывод с новой строки.

Показать ответ и разбор

Коротко

Код выведет: true, true, v. ArrayList.contains использует только equals, он переопределён: true.

Что выведет

true
true
v

Разбор

ArrayList.contains использует только equals, он переопределён: true. Record генерирует согласованные equals и hashCode: true. В HashMap ищем тем же объектом-ключом: хеш тот же (Object.hashCode стабилен), ссылки равны, поэтому v. Проблема с отсутствующим hashCode проявилась бы при поиске новым объектом new P(2).

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.