HashMap에서 사용되는 인스턴스 객체의 equals()와 hashCode() 재 정의 중요성
JAVA/JAVA 관련

HashMap에서 사용되는 인스턴스 객체의 equals()와 hashCode() 재 정의 중요성

반응형

HashMap 저장되어 있는  값을 통해 저장된 value 값을 찾을 입력된 object 동일한 hashCode 값을 가지고 있는키를 찾기 위해  객체에 정의된 equals 메소드를 사용한다.

 

 개의 object  정의한 equals 통해 비교한  동일한 객체  경우 동일한 hashCode값을 반환한다.

 

그렇기에 instance 객체를 hashMap key값으로 사용하고 싶은 경우에는 비교에 사용되는 equals() 동일한 객체에 대한 동일한 hashCode 값을 반환하는 hashCode() 메소드를 Override 해야한다.

 

 참고자료




https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.KeySetView.html

http://www.javamex.com/tutorials/collections/hash_code_equals.shtml

https://en.wikipedia.org/wiki/Java_hashCode()


실제로 진행중인 프로젝트에서


다음과 같은 상황이 있었다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
public class Person {
 
private int id;
 
private String name;
 
 
 
public Person(int id, String name) {
 
this.id = id;
 
this.name = name;
 
}
 
 
 
@Override
 
public boolean equals(Object obj) {
 
return this == obj || (this.id == obj.id && this.name.equals(obj.name);
 
}
 
}
 
 
 
private static final HashMap<Person, String> map = new HashMap<Person, String>(); 
 
 
 
public static void main(String[] args) {
 
Person A = new Person(1'babo');
 
map.put(A, 'is you');
 
 
 
String str = null;
 
str = map.get(new Person(1'babo'));
 
 
 
if (str == null) {
 
System.out.println("omg");
 
}
 
}
 
 
 
Result
 
=> omg
cs



위에 내용은 블로그에서 직접 약식으로 만든 것이라 대충 보면 될 것 같다.


문제 상황은 위에서 hashMap의 키 값으로 입력한 Person 인스턴스 객체를 


다시 찾으려고 동일한 값을 가진 Person객체를 삽입 하였으나


map에서 value를 받아오지 못했다.


그 이유는 Person 클래스에 equals() 메소드는 정의 하였으나, 동일한 객체면 동일한 hashCode 값이 반환되도록


hashCode() 메소드를 재 정의 하지 않았기 때문이다.


그래서 map에서는 두개의 객체가 서로 다른 hashCode 값을 반환하는 다른 객체로 보았기 때문에 value를 반환하지 못했다.


결론은 클래스를 정의할 때는 equals()를 재 정의해서 사용할 때, hashCode()도 같이 재정의 할것!

반응형