해시맵 (HashMap)과 해시셋 (HashSet)
HashMap과 HashSet은 모두 자바에서 java.util 패키지에 포함된 컬렉션 클래스입니다. 둘 다 해시 테이블을 기반으로 하며, 빠른 검색, 삽입, 삭제 등을 지원합니다. 그러나 이 둘은 목적과 사용 방식에서 차이가 있습니다.
1. HashMap
HashMap은 키와 값의 쌍으로 데이터를 저장하는 컬렉션입니다. 이 클래스는 해시 테이블을 사용하여 키를 기반으로 값을 검색하거나 삽입할 때 매우 효율적입니다.
- 키와 값: 각 항목은 키-값 쌍으로 저장됩니다.
- 순서 없음: HashMap은 저장된 순서를 보장하지 않습니다. 즉, 입력된 순서와는 관계없이 요소가 저장될 수 있습니다.
- 중복된 키 불허: HashMap은 동일한 키를 여러 번 저장할 수 없으며, 새로 값을 삽입하면 기존 값을 덮어씁니다.
- Null 키와 값 허용: HashMap은 하나의 null 키와 여러 개의 null 값을 허용합니다.
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args) {
// HashMap 객체 생성
HashMap<String, Integer> map = new HashMap<>();
// 값 삽입
map.put("apple", 1);
map.put("banana", 2);
map.put("cherry", 3);
// 값 출력
System.out.println("Apple: " + map.get("apple")); // 1
System.out.println("Banana: " + map.get("banana")); // 2
System.out.println("Cherry: " + map.get("cherry")); // 3
// 키 존재 여부 확인
if (map.containsKey("apple")) {
System.out.println("Apple is present.");
}
// 키와 값 삭제
map.remove("banana");
// 전체 키-값 출력
System.out.println("Contents of map: " + map);
}
}
Apple: 1
Banana: 2
Cherry: 3
Apple is present.
Contents of map: {apple=1, cherry=3}
2. HashSet
HashSet은 값만 저장하며 중복을 허용하지 않는 컬렉션입니다. 이 클래스 역시 해시 테이블을 사용하여 값들을 관리하며, 빠른 검색과 삽입, 삭제를 지원합니다.
- 값만 저장: HashSet은 키-값 쌍을 저장하지 않고, 단순히 값만 저장합니다.
- 중복 불허: 같은 값은 한 번만 저장할 수 있습니다. 동일한 값을 삽입하려고 하면 추가되지 않습니다.
- 순서 없음: HashSet은 요소의 순서를 보장하지 않으며, 저장된 순서와 다른 순서로 요소가 반환될 수 있습니다.
- Null 값 허용: HashSet은 하나의 null 값을 허용합니다.
import java.util.HashSet;
public class HashSetExample {
public static void main(String[] args) {
// HashSet 객체 생성
HashSet<String> set = new HashSet<>();
// 값 삽입
set.add("apple");
set.add("banana");
set.add("cherry");
// 중복 삽입 시도
set.add("apple"); // 중복이므로 삽입되지 않음
// 값 출력
System.out.println("HashSet contents: " + set);
// 값 존재 여부 확인
if (set.contains("banana")) {
System.out.println("Banana is present.");
}
// 값 삭제
set.remove("cherry");
// 값 출력
System.out.println("Updated HashSet: " + set);
}
}
HashSet contents: [apple, banana, cherry]
Banana is present.
Updated HashSet: [apple, banana]
HashMap과 HashSet의 주요 차이점
| 특징 | HashMap | HashSet |
| 저장 방식 | 키와 값 (Key-Value Pair) | 값만 저장 (Value Only) |
| 중복 여부 | 키는 중복 불가, 값은 중복 가능 | 중복된 값은 저장되지 않음 |
| 순서 | 저장 순서를 보장하지 않음 | 저장 순서를 보장하지 않음 |
| NULL | null 키와 값 모두 허용 | null 값 하나만 허용 |
| 사용 용도 | 데이터를 키-값 쌍으로 저장해야 할 때 사용 | 중복을 허용하지 않는 값들을 저장할 때 사용 |
| 주요 메서드 | put(), get(), containsKey(), remove() | add(), contains(), remove() |
사용 용도
- HashMap:
- 키-값 쌍으로 데이터를 저장할 때 유용합니다. 예를 들어, 특정 키에 대한 값을 빠르게 조회하고 싶을 때 사용됩니다.
- 예시: 사용자 ID와 이름을 매핑하는 경우, 학생 번호와 성적을 저장하는 경우 등.
- HashSet:
- 중복된 값을 허용하지 않는 데이터 집합이 필요할 때 유용합니다. 예를 들어, 중복된 요소를 피하면서 고유한 값을 저장하고 싶을 때 사용됩니다.
- 예시: 중복되지 않는 사용자 이메일 목록을 저장하거나, 한 번도 방문하지 않은 URL 목록을 저장하는 경우 등.
성능 차이
HashMap과 HashSet 모두 해시 테이블을 기반으로 하기 때문에 검색, 삽입, 삭제와 같은 기본 연산에서 평균적으로 O(1)의 시간 복잡도를 가집니다. 그러나 충돌이 발생하거나 해시 함수의 품질에 따라 최악의 경우에는 O(n)이 될 수 있습니다.
- HashMap은 키와 값의 쌍을 저장하고 처리하는 데 필요한 메모리 공간이 더 큽니다.
- HashSet은 단순히 값만 저장하기 때문에 상대적으로 메모리 사용이 적습니다.
결론
- HashMap은 키-값 쌍으로 데이터를 저장할 때 사용하고, 키를 통해 빠르게 값을 조회하거나 수정할 수 있는 데이터 구조입니다.
- HashSet은 중복되지 않는 값들을 저장할 때 사용하며, 값들의 집합을 관리할 때 유용합니다.