И снова я хочу больше, чем заложили изначально в задачу. Те, кому это ещё не надоело, помогите разобраться, я запутался. Изначально в условиях не сказано и Валидатор спокойно принимает без проверки на такое условие: Допустим, user был изначально создан БЕЗ инициализации поля firstName. Все остальные поля инициализированы. Наша задача: save -> load, и чтобы методы hashCode и equals выдали true. По сути, у нас в файл запишется текстовое "null" при таком раскладе (это если мы сознательно на этапе инициализации не заложим логику, что не должно быть null). При чтении файла мы учитываем это и присваиваем "нормальное" null полю firstName loadedObject: String fn = reader.readLine(); user.setFirstName(fn != "null" ? fn : null); По идее, когда мы будем сравнивать объекты User через класс JavaRush (плюс я еще проверяю состояние firstName): System.out.println(javaRush.hashCode() == loadedObject.hashCode()); System.out.println(javaRush.equals(loadedObject)); System.out.println(javaRush.users.get(0).getFirstName()); System.out.println(loadedObject.users.get(0).getFirstName()); мы выйдем на проверку переопределенными методами equals и hashCode класса User, которые учитывают null: @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; if (isMale != user.isMale) return false; if (firstName != null ? !firstName.equals(user.firstName) : user.firstName != null) return false; if (lastName != null ? !lastName.equals(user.lastName) : user.lastName != null) return false; if (birthDate != null ? !birthDate.equals(user.birthDate) : user.birthDate != null) return false; return country == user.country; } @Override public int hashCode() { int result = firstName != null ? firstName.hashCode() : 0; result = 31 * result + (lastName != null ? lastName.hashCode() : 0); result = 31 * result + (birthDate != null ? birthDate.hashCode() : 0); result = 31 * result + (isMale ? 1 : 0); result = 31 * result + (country != null ? country.hashCode() : 0); return result; } Однако, в консоль я получаю: false false null null Что я не понял или делаю не так? И можно ли как-то получить true, при этом оставив поля не инициализированными?