Что выведет код 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 ошибок.