IDE Generate 기능에서 항상 equals
와 hashCode
를 같이 재정의해준다.
equals()
의 반환값이 true
라면, hashCode()
의 반환값이 서로 같아야 한다는 규칙이 있다고 알고 있지만, 왜 그런 규칙이 존재하는지 예제를 통해서 알아보자.
예제를 위해서 Student
클래스를 다음과 같이 정의하였고 equals()
메서드만 재정의 하였다.
class Student {
private String name;
private String gender;
private int age;
public Student(String name, String gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name) &&
Objects.equals(gender, student.gender);
}
}
Student 객체 2개를 List
에 담았기 때문에 출력결과는 당연히 2
가 된다.
public static void main(String[] args) {
ArrayList<Student> students = new ArrayList<>();
students.add(new Student("홍길동", "남자", 26));
students.add(new Student("홍길동", "남자", 26));
System.out.println(students.size());
}
2
요구사항이 추가가 되었다.
Collection
에 중복되지 않는Student
객체만 넣어라.
중복을 피하기 위해서 List
가 아닌 Set
으로 로직 변경을 해보자.
public static void main(String[] args) {
HashSet<Student> students = new HashSet<>();
students.add(new Student("홍길동", "남자", 26));
students.add(new Student("홍길동", "남자", 26));
System.out.println(students.size());
}
2
나의 의도와는 다르게 2
가 출력되었다.
hashCode()
를 같이 재정의하지 않았기 때문에 내 의도와 다르게 동작하고 있다.
equals()
와hashCode()
를 같이 재정의하지 않는다면, hash 값을 사용하는Collection
을 사용할 때 문제가 발생한다.
HashSet
이 중복이라고 판단하는 기준
hashCode()
의 리턴 값이 일치하고,true
일 때hashCode()
또한 재정의 해주면 의도대로 코드가 동작한다.import java.util.HashSet;
import java.util.Objects;
class Student {
private String name;
private String gender;
private int age;
public Student(String name, String gender, int age) {
this.name = name;
this.gender = gender;
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age && Objects.equals(name, student.name) &&
Objects.equals(gender, student.gender);
}
@Override
public int hashCode() {
return Objects.hash(name, gender, age);
}
}
public class EqualsAndHashCodeEx {
public static void main(String[] args) {
HashSet<Student> students = new HashSet<>();
students.add(new Student("홍길동", "남자", 26));
students.add(new Student("홍길동", "남자", 26));
System.out.println(students.size());
}
}
1