Hash Table
•
HashTable은 <key,value> 형태로 데이터를 저장하는 자료구조
•
key 값을 기준으로 해시함수를 사용하여 해시값(hashCode)을 알아내고 그 해시값을 인덱스로 변환하여 키 값과 데이터를 버킷 (bucket) 안에 저장한다
•
하지만 HashTable 크기는 한정적이기 때문에 같은 서로 다른 객체라 하더라도 같은 해시값을 갖게 될 수도 있다. 이것을 해시 충돌(Hash Collision)이라고 한다.
•
이런 경우 아래와 같이 해당 버킷(Bucket)에 LinkedList 형태로 객체를 추가한다 (LinkedList 아이템의 갯수가 8개 이상으로 넘어가면 TreeMap 자료구조로 저장)
•
이처럼 같은 해시값의 버킷 안에 다른 객체가 있는 경우 equals 메서드가 사용된다
HashCode()
•
객체의 hashCode를 반환한다
•
해시 알고리즘에 의해 생성된 정수 값으로 객체를 식별하는데 사용된다
•
Object의 hashCode() 메소드는 객체의 메모리 주소를 이용해서 해시코드를 만들어 리턴하기 때문에 객체 마다 다른 값을 가지고 있다
public class Person {
private String Name;
private Integer Age;
}
Java
복사
public static void main(String args[]) {
Person person1 = new Person();
Person person2 = new Person();
System.out.println(person1.hashCode());
System.out.println(person2.hashCode());
}
Java
복사
실행 결과:
1118140819
1975012498
hashCode() 재정의
@Override
public
int
hashCode()
{
return
Age;
}
@Override
public int hashCode() {
return Age;
}
Java
복사
•
hashCode() 메서드를 재정의했다고 객체의 내부 주소가 바뀌는 것은 아니다
•
hashCode()를 재정의 하면 equals()도 재정의 해야하고 반대의 경우도 같다