Переопределил equals() и hashCode(), но почему в коллекцию все равно попадают одинаковые элементы?
ОМФГ. Вообще так не делай. 
Вариант 1) Написал класс с полями и заставил IDE сгенерировать всё остальное. Не будет глупых ошибок.
Вариант 2) Взял AutoValue и всё генерируется при компиляции.
Во-первых, проверка на соответствие классов должна быть в начале метода equals, иначе возможно исключение. А во-вторых вы два раза сравниваете x: сначала с x, а затем с z