[Java] Set
Set, java.util.Set, Java Set, Set interface, 집합
정의
java.util.Set<E> 는 중복을 허용하지 않는 Collection. 수학의 집합 (set) 에 대응. 같은 원소를 두 번 추가하면 두 번째는 무시된다.
Collection 인터페이스의 모든 메서드를 그대로 사용하면서, equals 와 hashCode (또는 compareTo) 로 중복 판단.
핵심 메서드
| 메서드 | 의미 |
|---|---|
add(E) | 추가, 이미 있으면 false 반환 |
contains(Object) | 포함 여부 |
remove(Object) | 제거 |
size() | 원소 개수 |
추가/조회/삭제의 시간 복잡도는 구현체에 따라 다르다.
구현체 비교
| 구현 | 백킹 | 평균 시간 | 순서 |
|---|---|---|---|
| HashSet | HashMap | O(1) | 없음 |
LinkedHashSet | LinkedHashMap | O(1) | 삽입 순서 |
| TreeSet | TreeMap | O(log n) | 정렬 |
CopyOnWriteArraySet | CopyOnWriteArrayList | O(n) (선형 검색) | 삽입 순서 |
ConcurrentSkipListSet | ConcurrentSkipListMap | O(log n) | 정렬, 동시성 |
EnumSet | bit vector | O(1) | enum 순서 |
대부분의 Set 구현은 내부적으로 Map 을 사용, key 만 노출하고 value 는 dummy.
불변 Set
Set<Integer> primes = Set.of(2, 3, 5, 7, 11);
null 비허용, 중복 인자 전달 시 IllegalArgumentException.
자주 쓰이는 set 연산
Set<Integer> a = new HashSet<>(List.of(1, 2, 3));
Set<Integer> b = new HashSet<>(List.of(2, 3, 4));
Set<Integer> union = new HashSet<>(a); union.addAll(b); // {1,2,3,4}
Set<Integer> inter = new HashSet<>(a); inter.retainAll(b); // {2,3}
Set<Integer> diff = new HashSet<>(a); diff.removeAll(b); // {1}
addAll, retainAll, removeAll 의 비용은 인자의 contains 가 빠를수록 좋다.
동기화
Set<Integer> sync = Collections.synchronizedSet(new HashSet<>());
Set<Integer> cow = new CopyOnWriteArraySet<>(); // 읽기 多, 쓰기 少
Set<Integer> csl = new ConcurrentSkipListSet<>(); // 정렬 + 동시성
ConcurrentHashMap 의 keySet() view 도 thread-safe 집합으로 자주 활용.
Set<Integer> set = ConcurrentHashMap.newKeySet();
함정
1. 가변 객체를 원소로
HashMap 과 같은 함정. hashCode/equals 가 변하는 원소는 Set 에서 찾을 수 없게 된다.
2. equals 만 override
Object 의 규약 위반. HashSet, LinkedHashSet 이 잘못 동작.
참고
이 글의 용어 (9개)
- [Java] Collectionjava
- 정의 는 그룹으로 묶인 객체들을 표현하는 최상위 인터페이스. JCF (Java Collections Framework) 의 입구이자, / / / 모두 이를 확장한다. 자체는 직접…
- [Java] ConcurrentHashMapjava
- 정의 는 고동시성 환경에서 사용 가능한 구현. JSR-166 (Java 5) 도입, Java 8 에서 내부 구조가 크게 재작성됐다. 과 같은 인터페이스를 제공하면서 thread-…
- [Java] CopyOnWriteArrayListjava
- 정의 는 쓰기 시 배열 전체를 복사 하는 thread-safe 구현. 읽기에는 lock 이 전혀 없고, 쓰기에는 으로 직렬화한다. (JSR-166) 의 컬렉션. 읽기 압도적 다,…
- [Java] HashMapjava
- 정의 는 해시 테이블 로 구현된 . 평균 O(1) 의 put/get/remove 를 보장하고 단일 스레드 환경의 사실상 표준. JDK 1.2 도입, Java 8 에서 충돌 시 l…
- [Java] HashSetjava
- 정의 는 을 백킹으로 사용하는 구현. 내부적으로 모든 원소를 HashMap 의 key 로 저장하고, value 는 dummy 상수 . 평균 O(1) 의 add/remove/con…
- [Java] Iterablejava
- 정의 는 루프로 순회 가능한 모든 타입의 최상위 인터페이스. 단 하나의 추상 메서드, 를 정의한다. 인터페이스가 을 extends 하므로 , , , 등 모든 컬렉션이 자동으로 대…
- [Java] Objectjava
- 정의 는 Java 의 모든 클래스의 최상위 부모 (root) 클래스. 가 명시되지 않은 클래스는 컴파일러가 자동으로 를 붙인다. 인터페이스는 클래스가 아니라 를 직접 상속하지는 …
- [Java] TreeSetjava
- 정의 는 을 백킹으로 사용하는 정렬된 . 인터페이스를 구현해 정렬 기반 연산 ( , , 등) 을 제공. 원소는 (자연 순서) 또는 생성자에 전달한 로 정렬. 핵심 메서드 (Nav…
- 집합과 맵 (Set and Map)algorithm
- 정의 집합 (Set) 은 고유한 원소들의 모임을 나타내는 추상 자료구조로, 멤버십 검사, 삽입, 삭제를 지원한다. 맵 (Map, Dictionary) 은 키-값 쌍을 저장하며, …
💬 댓글