Встроенный hashCode()
и equals()
отлично работает.Они согласованы в соответствии с требованиями HashMap
(то есть: если hashCode()
s не идентичны, equals()
всегда будет возвращать false
).Это потому, что каждый экземпляр объекта будет только equal()
для себя.
Однако зачастую это не то, что вы хотите.В частности, без переопределения этих методов два экземпляра Student
с одинаковыми полями не будут считаться равными.Таким образом, это напечатает три строки вместо одной:
Map<Student,Integer> map = new HashMap<>();
Student s1=new Student(1,"A");
Student s2=new Student(1,"A");
Student s3=new Student(1,"A");
map.put(s1,1);
map.put(s2,2);
map.put(s3,3);
for(Student s:map.keySet()) {
System.out.println(map.get(s) + "->" + s.id + " " +s.name);
}
(Примечание: технически это все совершенно правильно, но это не обязательно то, что большинство людей, читающих ваш код, ожидали бы.)