해시는 해시 함수를 사용해서 변환한 값을 인덱스로 삼아 키와 값을 저장해서 빠른 데이터 탐색을 제공하는 자료구조이다. 키와 데이터가 일대일 대응하므로 키를 통해 데이터에 바로 접근할 수 있다.
특정 데이터를 탐색하는 횟수가 많을 경우 해시를 고려하면 좋다!
ex. 연락처: 전화번호는 값(value)이고, 값을 검색하기 위해서 활용하는 정보는 키(key)이다. 그리고 그 사이에 키를 이용해 해시값 또는 인덱스로 변환하는 해시 함수가 있다.
해시 테이블은 키와 대응한 값이 저장되어 있는 공간.
해시 테이블의 각 데이터를 버킷(bucket)이라고 함.
JAVA에서는 해시셋 혹은 해시맵이라는 표준 API를 제공하는데 이 클래스는 해시와 거의 동일하게 동작하므로 해시를 쉽게 사용할 수 있다.
서로 다른 키에 대해서 해시 함수의 결과값이 같으면 충돌(collision)이라고 한다.
체이닝으로 처리하기 —java에서 HashMap 클래스가 사용하는 법
체이닝은 충돌이 발생하면 해당 버킷에 Linked List로 같은 해시값을 가지는 데이터를 연결하여 해결한다.
개방 주소법으로 처리하기(open addressing)
빈 버킷을 찾아 충돌값을 삽입한다. 메모리를 더 효율적으로 사용하는 방법이다.
해시맵을 위한 HashTable 클래스와 HashMap 클래스가 있다. 유사하지만 전자는 자바의 초기 버전과 호환성을 위한 것일 뿐 최근에는 잘 사용하지 않는다.
HashMap<KeyType, ValueType>
구분 | 정의 | 설명 |
---|---|---|
연산 | put(KeyType key, ValueType value) | 해시맵에 데이터를 저장합니다. 첫 번째 매개변수는 해당 데이터의 key 값, 두 번째 매개변수는 해당 key에 해당하는 value 값입니다. 반환하는 값은 해시맵 내에 동일한 key에 해당하는 값이 있었다면 그 key에 대한 value 값을 반환합니다. |
get(KeyType key) | key 값에 대한 value 값을 반환합니다. | |
remove(KeyType key) | 해시맵에서 key에 해당하는 데이터를 삭제합니다. | |
containsKey(KeyType key) | 해시맵 안에 해당 key가 있다면 true, 없다면 false를 반환합니다. | |
getOrDefault(Object key, V defaultValue) | 해시맵 안에 해당 key가 있다면 해당 값을, 없다면 null 대신 기본 값을 반환하도록 할 수 있는 방법. | |
상태 | void clear() | 해시맵 안의 모든 데이터를 삭제합니다. |
int isEmpty() | 해시맵 안에 데이터가 없다면 true, 있다면 false를 반환합니다. | |
int size() | 해시맵 안에 있는 데이터의 개수를 반환합니다. |
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args) {
// HashMap<KeyType, ValueType> 입니다.
HashMap<String, Integer> hashMap = new HashMap<>();
// hashMap에 데이터 추가
hashMap.put("ABC", 10);
hashMap.put("BBB", 20);
hashMap.put("AAA", 30);
hashMap.put("ABC", 15); // 기존 "ABC" 키의 값이 15로 업데이트됨
System.out.println(hashMap.isEmpty()); // false
System.out.println(hashMap.get("ABC")); // 15
System.out.println(hashMap.containsKey("ABC")); // true
System.out.println(hashMap.getOrDefault("ABC", "디폴트값")); // 15
System.out.println(hashMap.getOrDefault("red", "디폴트값")); // 디폴트값
// hashMap에서 키 "ABC"인 데이터 제거
hashMap.remove("ABC");
System.out.println(hashMap.size()); // 2
// 해시맵의 모든 데이터 삭제
hashMap.clear();
System.out.println(hashMap.isEmpty()); // true
}
}
HashMap | HashSet | |
---|---|---|
저장 방식 | 키-값 (Key-Value) 쌍 저장 | 유일한 값 (Unique Value) 저장 |
중복 허용 여부 | 키(Key)는 중복 불가, 값(Value)은 중복 가능 | 값(Value)이 중복 불가 |
내부 구현 | HashTable 기반 (HashMap<K, V> ) | 내부적으로 HashMap<K, Object> 사용 |
null 허용 여부 | 키에 null 허용 (한 개만), 값에는 여러 개 가능 | null 값 한 개 허용 |
사용 목적 | 키-값 매핑이 필요할 때 | 유일한 요소 집합이 필요할 때 |
참고 자료: 코딩테스트 합격자 되기 : 자바편