HashSet과 TreeSet은 모두 자바 컬렉션 프레임워크(Collection Framework)에 포함된 대표적인 Set 구현 클래스입니다. HashSet은 Set 인터페이스를 구현한 반면, TreeSet은 SortedSet 인터페이스를 구현합니다. 내부적으로 TreeSet은 TreeMap을 기반으로 동작하고, HashSet은 HashMap을 기반으로 동작한다는 점도 중요한 차이입니다.
HashSet vs TreeSet 주요 차이점 비교
| 번호 | 구분 | HashSet | TreeSet |
|---|---|---|---|
| 1 | 구현 방식 | 해시 테이블(HashTable)을 기반으로 구현됨 | 트리 구조(레드-블랙 트리)를 기반으로 구현됨 |
| 2 | null 저장 여부 | null 값을 하나까지 허용함 | null 값을 허용하지 않으며, 저장 시 NullPointerException이 발생함 |
| 3 | 객체 비교 방식 | equals() 메서드로 두 객체를 비교함 | compare()(또는 compareTo()) 메서드로 두 객체를 비교함 |
| 4 | 이종 객체 허용 | 타입이 서로 다른 객체도 저장할 수 있음 | 타입이 다른 객체를 허용하지 않으며, 비교할 수 없으면 ClassCastException이 발생함 |
| 5 | 정렬 순서 | 요소의 순서를 전혀 유지하지 않음 | 요소를 항상 정렬된 상태(오름차순)로 유지함 |
TreeSet 예제 코드
class TreeSetExample {
public static void main(String[] args){
TreeSet<String> treeset = new TreeSet<String>();
treeset.add("Good");
treeset.add("For");
treeset.add("Health");
// 중복 요소 추가 시도
treeset.add("Good");
System.out.println("TreeSet : ");
for (String temp : treeset) {
System.out.println(temp);
}
}
}실행 결과
TreeSet :
For
Good
Health
출력 결과를 보면 중복으로 추가한 "Good"은 한 번만 저장되며, 요소들이 알파벳 순서대로 정렬되어 출력되는 것을 확인할 수 있습니다.
HashSet 예제 코드
class HashSetExample {
public static void main(String[] args){
HashSet<String> hashSet = new HashSet<String>();
hashSet.add("Good");
hashSet.add("For");
hashSet.add("Health");
// 중복 요소 추가 시도
hashSet.add("Good");
System.out.println("HashSet: ");
for (String temp : hashSet) {
System.out.println(temp);
}
}
}실행 결과
HashSet :
Health
For
Good
HashSet은 입력한 순서와 무관하게 내부 해시 알고리즘에 따라 임의의 순서로 출력됩니다. 다만 중복 요소인 "Good"은 마찬가지로 한 번만 저장됩니다.
어떤 상황에서 무엇을 사용해야 할까?
HashSet은 정렬이 필요 없고 빠른 삽입·삭제·검색 성능(평균 O(1))이 중요한 경우에 적합합니다. 반면 TreeSet은 데이터가 항상 정렬된 상태로 유지되어야 할 때 유용하며, 삽입·삭제·검색에 O(log n)의 시간이 소요됩니다.
정리하면, 두 클래스 모두 중복 없는 데이터 저장이라는 공통 목적을 가지지만, 정렬 필요 여부와 성능 요구 사항에 따라 적절한 구현체를 선택하는 것이 좋습니다.