개발 등/중급

컬렉션에서 객체 비교하는 방법

darkhorizon 2008. 9. 8. 20:14
728x90
반응형
Hash 가 구현된 컬렉션들은 다음의 조건으로 수행된다.
1. 객체의 hashCode() 를 먼저 호출한 후, 리턴 값을 저장한다.
2. 이후 추가되는 객체의 hashCode()를 호출한 후 리턴값이 동일하면 해당 객체의 equals()를 호출해서 값을 비교한다.
3. 두 메서드가 모두 동일하면 같은 객체로 취급한다.
예외) String Class는 equals()와 hashCode() 모두 '문자열의 내용이 동일하면 같은 값을 리턴하도록 오버라이딩되어 있음.

class A{
int m;
String name;
public A(int m, String name){
this.m=m;
this.name=name;
}
public int hashCode(){
System.out.println(name + " : hashCode");
return this.m;  // m 값이 동일하면 같은 값을 리턴하고 싶다는 의미?
}
public boolean equals(Object obj){
System.out.println(name+" : equals");
if(obj instanceof A){
A a=(A)obj;  // A 타입으로 다운캐스팅
return this.m==a.m;   //m 값이 동일하면 true를 리턴하겠다는 의미
}
return false;
}
}
class Test{
public static void main(String[] args){
HashSet<A> hs=new HashSet<A>();

hs.add(new A(100,"First"));
hs.add(new A(50,"Second"));
hs.add(new A(150,"Third"));

hs.remove(new A(50,"Forth"));
}
}

출력값 : java Test

First : hashCode
Second : hashCode
Third : hashCode
Forth : hashCode
Forth : equals

728x90