Dlaczego tak
Rekord (record) to zwięzła deklaracja niemodyfikowalnego typu danych, dla którego kompilator sam generuje konstruktor, metody dostępowe x() i y() oraz equals(), hashCode() i toString() oparte na składowych. Dlatego p.equals(q) porównuje wartości pól i zwraca true. Operator == porównuje referencje, a p i q to dwa osobne obiekty utworzone przez new, więc wynik to false. Odpowiedź false false zakłada domyślne equals() z klasy Object.