728x90
hashCode()
- 모든 클래스들이 상속받는 Object 클래스에 있는 메서드입니다.
- equals() 처럼 객체끼리 같은 객체인지 비교할 때 사용되는 메서드입니다.
- HashMap, HashSet과 같은 HashTable 자료구조를 사용할 때 유용하게 쓸 수 있습니다.
- HashTable 자료구조는 객체의 hashCode로 하여금 index로 사용하여 자료를 저장합니다. 때문에 만약 HashTable안에서 같은 객체로 인식되게 하고픈 객체들이 있으면 같은 hashCode값을 반환하게 하면 됩니다.
예시
1. hashCode() 메서드를 오버라이드하지 않고 HashSet.contains() 사용
import java.util.*;
public class Main {
static Set<Number> set = new HashSet<>();
public static void main(String[] args) {
set.add(new Number(0));
System.out.println(set.contains(new Number(0)));
// 결과 : false;
}
static class Number {
int p;
public Number(int p){
this.p = p;
}
@Override
public boolean equals(Object obj) {
return p == ((Number)obj).p;
}
}
}
hashCode() 메서드를 오버라이드 하지 않고 equals만 오버라이드 할 때는 HashSet 안에서 같은 객체를 찾을 수가 없습니다.
2. hashCode() 메서드를 오버라이드해서 HashSet.contains() 사용
import java.util.*;
public class Main {
static Set<Number> set = new HashSet<>();
public static void main(String[] args) {
set.add(new Number(0));
System.out.println(set.contains(new Number(0)));
// 결과 : true;
}
static class Number {
int p;
public Number(int p){
this.p = p;
}
@Override
public boolean equals(Object obj) {
return p == ((Number)obj).p;
}
@Override
public int hashCode() {
return this.p;
}
}
}
하지만 hashCode()를 같이 오버라이드 해서 사용하면 같은 객체임을 인식하게 됩니다. (equals()도 같이 선언해야합니다.)
728x90
'Java' 카테고리의 다른 글
[자바] 접근 제어자 (0) | 2020.10.23 |
---|---|
[자바] 직렬화 (Serialize) (0) | 2020.10.20 |
[자바] Collections 자료구조 (0) | 2020.09.15 |
[자바] 자바의 실행구조 (0) | 2020.09.15 |
[자바] 인터페이스 (Interface) (0) | 2020.09.15 |
댓글