HashSet — 해시 테이블 기반 집합
HashSet — 해시 테이블 기반 집합
HashSet<E>는 해시 테이블(실제로는 HashMap 인스턴스)로 백업되는 Set 인터페이스 구현이에요. 집합의 순회 순서를 보장하지 않으며, 순서가 시간이 지나도 일정하다는 보장도 없어요. null 요소를 허용해요.
본문
public class HashSet<E> extends AbstractSet<E>
implements Set<E>, Cloneable, Serializable
해시 함수가 요소를 버킷에 잘 분산한다고 가정하면 기본 연산(add, remove, contains, size)은 상수 시간에 수행돼요. 순회 시간은 인스턴스의 크기(요소 수)와 백업 HashMap의 "용량"(버킷 수)의 합에 비례해요. 따라서 순회 성능이 중요하다면 초기 용량을 너무 크게(또는 로드 팩터를 너무 작게) 잡지 말아야 해요.
이 구현은 동기화되지 않아요. 여러 스레드가 동시에 접근하고 그중 하나라도 수정한다면 외부에서 동기화해야 해요. 보통 Collections.synchronizedSet(new HashSet(...))처럼 감싸서 만들 때 동기화하는 게 좋아요.
이 클래스의 iterator가 반환하는 반복자는 fail-fast예요. 반복자 생성 후 집합이 반복자의 remove 외의 방법으로 수정되면 ConcurrentModificationException을 던져요. (다만 비동기 동시 수정 상황에서는 fail-fast 동작을 하드하게 보장할 수 없어요.)
생성자
HashSet()— 기본 초기 용량(16)과 로드 팩터(0.75)로 빈 집합을 만들어요.HashSet(Collection<? extends E> c)— 지정된 컬렉션의 요소를 담은 집합을 만들어요.HashSet(int initialCapacity, float loadFactor)— 지정된 초기 용량과 로드 팩터로 만들어요.HashSet(int initialCapacity)— 지정된 초기 용량과 기본 로드 팩터(0.75)로 만들어요.
기본 연산
iterator()— 특별한 순서 없이 요소를 돌려주는 반복자를 반환해요.size()— 요소 수(카디널리티)를 반환해요.isEmpty()— 요소가 없으면true를 반환해요.contains(Object o)—Objects.equals(o, e)인 요소e가 있으면true를 반환해요.add(E e)— 요소가 이미 없으면 추가하고, 이미 있으면 집합을 바꾸지 않고false를 반환해요.remove(Object o)— 요소가 있으면 제거하고true, 없으면false를 반환해요.clear()— 모든 요소를 제거해요.
기타
clone()— 얕은 복사본을 반환해요(요소 자체는 복제되지 않아요).spliterator()— late-binding이고 fail-fast인Spliterator를 만들며SIZED와DISTINCT특성을 보고해요.toArray()/toArray(T[] a)—AbstractCollection에서 상속받아 집합을 배열로 변환해요.newHashSet(int numElements)— 기대 요소 수에 알맞은 빈 집합을 만들어요. 기본 로드 팩터 0.75를 쓰고, 크기 재조정 없이 기대 요소 수를 담을 수 있을 만큼 초기 용량이 충분해요.