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()도 같이 재정의 할것!
'JAVA > JAVA 관련' 카테고리의 다른 글
Java List 인터페이스 중 CopyOnWriteArrayList 소개 (0) | 2018.06.03 |
---|---|
java 메모리 누수 주된 원인 (0) | 2018.05.28 |
자바 Annotation 만들기 (0) | 2018.05.28 |
Java Reflection 설명 및 사용법 (0) | 2018.05.28 |
Java 문자열의 toString과 valueOf의 차이 (0) | 2018.05.28 |