11.3 HashSet과 TreeSet
Set은 중복을 허용하지 않는 집합(Set) 이라는 수학 개념을 그대로 구현한 컬렉션입니다. 같은 값을 두 번 저장하려고 하면 자동으로 무시합니다. 주로 "이 항목이 존재하는지 여부" 확인이나, 중복 없이 고유한 데이터만 보관 할 때 씁니다.
1. HashSet
가장 많이 쓰이는 Set 구현체입니다. 저장 순서를 보장하지 않습니다(넣은 순서와 꺼내는 순서가 다를 수 있습니다).
import java.util.HashSet;
HashSet<String> tags = new HashSet<>();
// 1. add(): 요소 추가
tags.add("Java");
tags.add("Spring");
tags.add("MySQL");
tags.add("Java"); // 중복! 자동으로 무시됨
System.out.println(tags); // [Spring, Java, MySQL] (순서 불규칙)
System.out.println(tags.size()); // 3 (중복 제거 후)
// 2. contains(): 요소 존재 여부 확인 (매우 빠름 - O(1))
System.out.println(tags.contains("Java")); // true
System.out.println(tags.contains("Python")); // false
// 3. remove(): 요소 삭제
tags.remove("MySQL");
System.out.println(tags); // [Spring, Java]
HashSet 실전 활용: 중복 제거
import java.util.ArrayList;
import java.util.HashSet;
ArrayList<String> names = new ArrayList<>();
names.add("김철수");
names.add("이영희");
names.add("박민준");
names.add("김철수"); // 중복!
names.add("이영희"); // 중복!
// ArrayList를 HashSet으로 넣으면 중복이 자동으로 사라집니다!
HashSet<String> uniqueNames = new HashSet<>(names);
System.out.println(uniqueNames); // [이영희, 박민준, 김철수]
System.out.println("중복 제거 후 인원: " + uniqueNames.size()); // 3
2. TreeSet
TreeSet은 저장되는 요소를 자동으로 정렬 해서 보관합니다. 기본적으로 오름차순(숫자: 작은 것부터, 문자: 가나다/abc 순)으로 정렬됩니다. 정렬이 필요 없다면 속도가 더 빠른 HashSet을 사용합니다.
import java.util.TreeSet;
TreeSet<Integer> scores = new TreeSet<>();
scores.add(85);
scores.add(92);
scores.add(70);
scores.add(100);
scores.add(85); // 중복 제거됨
System.out.println(scores); // [70, 85, 92, 100] (자동 오름차순 정렬!)
// 최솟값, 최댓값 바로 꺼내기
System.out.println("최저: " + scores.first()); // 70
System.out.println("최고: " + scores.last()); // 100