본문 바로가기

프로그래밍 언어 (プログラミング言語)/JAVA

Equal(), HashCode() in JAVA

eqaul 메서드와 hashCode 메서드를 이해하기 위해서는 JAVA에서 HashMap, HashSet, HashTable이 어떤 원리로 동작을

하는지와 같이 설명을 하면 이해가 쉽다. 

일단  equal 메서드와 hashCode 메서드 모두 Object 클래스에 있다.

equal 메서드는 보통, 객체를 생성하는 순간 자동으로 오버라이딩이 되어서 두 객체의 레퍼런스값을 비교하는 것이 아닌, 

두 객체 내부의 필드값들이 같은지 다른지를 비교한다. ( 객체의 레퍼런스값은 == 연산자로 비교 )

hashCode는 JAVA에서 객체를 Unique하게 식별하기 위한 정수값이며, hashCode()에서 hash function을 사용하

여 생성을 한다. 

 

JAVA의 HashTable의 동작 원리( HashMap, HashSet도 똑같이 동작을 한다.)

JAVA의 HashTable

HashTable의 put 동작

1. HashTable은 <key,value> 형태로 데이터를 저장한다

2. 해시 함수(Hash Function)을 이용하여 key값을 기준으로 고유한 식별값인 해시값을 만든다.

 (hashcode가 해시값을 만드는 역할을 한다.)

3. 해시값을 버킷(Bucket)에 저장.

(하지만 HashTable 크기는 한정적이기 때문에 같은 서로 다른 객체라 하더라도 같은 해시값을 갖게 될 수도 있다.

이것을 **해시 충돌(Hash Collisions)**이라고 한다. )

4. 해쉬 충돌이 일어나는 경우,  아래와 같이 해당 버킷(Bucket)에 LinkedList 형태로 객체를 추가한다.

( 참고로 java8인가 9버전부터 LinkedList 아이템의 갯수가 8개 이상으로 넘어가면 TreeMap 자료구조로 저장된다고 한다.)

  • 값이 같은 객체가 이미 있다면(equals()가 true) 기존 객체를 덮어쓴다.
  • 값이 같은 객체가 없다면(equals()가 false) 해당 entry를 LinkedList에 추가한다.

HashTable의 get 동작

1.key 값을 넣으면 hashCode()에 의해 해쉬값을 생성.

2.그 해쉬값을 기준으로 bucket을 찾음

3. 해당 bucket에는 해쉬값이 모두 같지만, 서로 다른 객체들이 존재하므로, equals 메서드를 통해 객체의 내부값 비교

  • 값이 같은 객체가 있다면 (equals()가 true) 그 객체를 리턴한다.
  • 값이 같은 객체가 없다면(equals()가 false) null을 리턴한다.