
해쉬맵(HashMap)
Java에서 제공하는 데이터 구조 중 하나로, 키(Key)와 값(Value)의 쌍을 저장하는 자료구조로 빠르게 데이터를 검색하고 저장할 수 있음
- 키와 값의 쌍: 각 요소를 키와 값의 쌍으로 저장하며 쌍은 서로 연결되어 있으며, 특정 키를 통해 해당 값에 빠르게 접근할 수 있음
- 중복 키 불가: 키는 중복되지 않고 동일한 키를 여러 번 추가할 수 없음
- 순서 보장하지 않음: 요소들의 순서를 보장하지 않고 데이터가 저장된 순서대로 접근할 수 없음
- 검색 및 삽입 시간 복잡도: HashMap은 해시 테이블을 사용하기 때문에 키를 기반으로 데이터를 검색하고 삽입하는 데 평균적으로 O(1)의 시간 복잡도를 가지지만 해시 충돌(Hash Collision)이 발생할 경우 시간 복잡도는 O(n)이 될 수 있음

import java.util.HashMap;
public class HashMapTest {
public static void main(String[] args) {
// HashMap 생성
HashMap<String, Integer> studentScores = new HashMap<>();
// 값 추가
studentScores.put("Alice", 95);
studentScores.put("Bob", 88);
studentScores.put("Charlie", 92);
// 값 조회
int aliceScore = studentScores.get("Alice");
System.out.println("Alice's Score: " + aliceScore);
// 값 삭제
studentScores.remove("Bob");
// 키가 존재하는지 확인
boolean isCharliePresent = studentScores.containsKey("Charlie");
System.out.println("Is Charlie present? " + isCharliePresent);
// HashMap 크기 확인
int size = studentScores.size();
System.out.println("HashMap Size: " + size);
// 모든 항목 출력
for (String name : studentScores.keySet()) {
int score = studentScores.get(name);
System.out.println(name + "'s Score: " + score);
}
}
}
해쉬테이블(HashTable)
해시 함수를 사용하여 키를 해시 코드로 변환하고 이 코드를 배열의 인덱스로 사용하여 데이터에 접근
- 해시 함수 사용: 해시 테이블은 해시 함수를 사용하여 각 키를 고유한 해시 코드(인덱스)로 변환하고 이 해시 코드를 사용하여 데이터를 저장하고 검색
- 빠른 검색 속도: 해시 테이블은 해시 코드를 이용해 데이터를 검색하기 때문에 평균적으로 O(1)의 시간 복잡도로 빠르게 데이터에 접근할 수 있음
- 중복 키 처리: 해시 테이블 내에서 중복된 키는 허용되지 않으며, 각 키는 유일해야 하고 중복 키가 발생하면 기존 값에 덮어씌워짐
- 크기 조절: 해시 테이블은 동적으로 크기를 조절할 수 있어야 하고 데이터의 양이 증가하면 해시 테이블의 크기를 확장하여 충돌을 최소화
- 해시 충돌 처리: 서로 다른 키가 같은 해시 코드로 매핑될 때 충돌이 발생하며 이를 해결하기 위해 충돌 처리 알고리즘을 사용
- 동기화(Synchronization) 지원: 멀티스레드 환경에서 안전하게 사용

public class HashTableTest {
public static void main(String[] args) {
// HashTable 생성
Hashtable<String, Integer> studentScores = new Hashtable<>();
// 값 추가
studentScores.put("Alice", 95);
studentScores.put("Bob", 88);
studentScores.put("Charlie", 92);
// 값 조회
int aliceScore = studentScores.get("Alice");
System.out.println("Alice's Score: " + aliceScore);
// 값 삭제
studentScores.remove("Bob");
// 키가 존재하는지 확인
boolean isCharliePresent = studentScores.containsKey("Charlie");
System.out.println("Is Charlie present? " + isCharliePresent);
// HashTable 크기 확인
int size = studentScores.size();
System.out.println("HashTable Size: " + size);
// 모든 항목 출력
for (String name : studentScores.keySet()) {
int score = studentScores.get(name);
System.out.println(name + "'s Score: " + score);
}
}
}
HashMap(해시맵)과 HashTable(해시테이블) 차이
- 동기화(Synchronization): HashTable은 스레드에 안전(thread-safe)한 자료구조로, 여러 스레드가 동시에 접근할 때 안전하게 사용할 수 있으나 HashMap은 동기화되어 있지 않으며, 여러 스레드 간에 동시에 접근할 때 문제가 발생할 수 있음
- Null 허용 여부: HashMap은 키와 값에 null을 허용하여 null 키와 null 값 모두 저장할 수 있으나 HashTable은 키나 값 중 하나라도 null인 경우 예외를 발생시킵니다.
- 성능: 일반적으로 HashMap의 성능이 HashTable보다 우수하며 이는 HashMap이 동기화 오버헤드가 없기 때문입니다.
반복 순서: HashMap은 순서를 보장하지 않으며 요소의 순서는 예측할 수 없으나 HashTable은 요소를 저장한 순서대로 순회 - Legacy 클래스: HashTable은 자바의 초기 버전부터 존재하던 레거시 클래스이며 HashMap은 보다 최신 버전의 자바에서 도입되어 더 많은 기능과 성능 개선을 제공함
'learn > data structure' 카테고리의 다른 글
파일 (File) (0) | 2023.09.24 |
---|---|
그래프 (Graph) (0) | 2023.09.24 |
트리 (Tree) (0) | 2023.09.24 |
데크 (Deque) (0) | 2023.09.24 |
큐 (Queue) (0) | 2023.09.24 |