자바의 정석을 통해 공부한 내용을 요약하였습니다.
HashSet의 add메서드는 기존에 저장된 요소와 같은 것인지 판단하기 위해 equals() 와 hashCode()를 호출한다.
그렇기 때문에 equals()와 hashCode()를 목적에 맞게 오버라이딩 해주어야 한다.
equals()와 hashCode()는 Object 클래스의 메서드이다.
예를 들어 아래와 같은 Person객체가 있다고 했을 때 멤버 변수의 값이 같은 인스턴스를 HashSet에 add를 하게되면 중복처리가 되지않고 두 인스턴스 모두 저장된다.
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
public String toString() {
return name +":"+ age;
}
}
이럴 경우 equals()와 hasCode()를 오버라이딩 해줘야 중복처리가 되는 것을 방지할 수 있다.
public boolean equals(Object obj) {
if(obj instanceof Person2) {
Person2 tmp = (Person2)obj;
return name.equals(tmp.name) && age==tmp.age;
}
return false;
}
public int hashCode() {
return (name+age).hashCode();
}
hashCode()는 아래와 같이 Objects클래스를 이용해서도 오버라이딩 할 수 있다.
public int hashCode() {
return Objects.hash(name, age);
}