[java] HashSet과 Set의 차이점은 무엇입니까?

다음과 같은 코드 스 니펫을 보았습니다.

Set<Record> instances = new HashSet<Record>();

Hashset이 특별한 종류의 세트인지 궁금합니다. 그들 사이에 어떤 차이가 있습니까?



답변

A Set는 일반적인 “값 집합”을 나타냅니다. A TreeSet는 요소가 정렬되어 정렬 HashSet된 집합이고 , a 는 요소가 정렬되거나 정렬 되지 않은 집합 입니다.

A HashSet는 일반적으로 TreeSet.

A는 TreeSet일반적으로 레드 – 블랙 트리로 구현된다 (참조 http://en.wikipedia.org/wiki/Red-black_tree – 나는 일 / 오라클의 실제 구현을 검증 된 적이 없다 TreeSet)하는 반면 HashSet용도가 Object.hashCode()에서 인덱스를 만들 배열. 레드-블랙 트리에 O(log(n))대한 액세스 시간 HashSet은 일정한 시간에서 선형 검색 시간을 가질 수있는 최악의 경우 (모든 항목이 동일한 hashCode를 가짐)에 이르는 범위에 대한 액세스 시간입니다 O(n).


답변

HashSet의 구현입니다 Set.


답변

질문에 대한 답변이 있었지만 코드가 동일한 코드에서 두 유형을 모두 언급하는 이유에 대한 답변을 보지 못했습니다.

일반적으로이 경우에는 Set 인 인터페이스에 대해 코딩하려고합니다. 왜? 항상 인터페이스를 통해 객체를 참조하는 경우 (new HashSet () 제외) 나중에 코드에서 한 번만 언급했기 때문에 객체의 구현을 변경하는 것이 더 낫다는 것을 알게되면 간단합니다. base (new HashSet ()를 한 곳).


답변

집합 은 중복 요소가없는 컬렉션입니다. 세트는 인터페이스입니다.

HashSetSet 은 해시 테이블 (실제로는 HashMap인스턴스)에 의해 지원되는 인터페이스를 구현합니다 .

이후는 HashSet특정 구현이다 Set인터페이스.

A Set는 아래 클래스에서 구현되었으므로 다음 중 하나 일 수 있습니다.

ConcurrentSkipListSet : 확장 가능한 동시 NavigableSet 구현입니다 ConcurrentSkipListMap. 집합의 요소 Comparator는 사용되는 생성자에 따라 자연 순서에 따라 또는 집합 생성시 제공된에 따라 정렬 됩니다.

CopyOnWriteArraySet : 모든 작업에 내부 CopyOnWriteArrayList를 사용하는 Set입니다.

EnumSet : enum 유형과 함께 사용하기위한 특수 Set 구현입니다. 열거 형 집합의 모든 요소는 집합을 만들 때 명시 적으로 또는 암시 적으로 지정된 단일 열거 형 유형에서 가져와야합니다.

TreeSet : TreeMap에 기반한 NavigableSet 구현입니다. 요소는 사용되는 생성자에 따라 자연 순서를 사용하거나 설정된 생성 시간에 제공된 비교기를 사용하여 정렬됩니다.

LinkedHashSet : 예측 가능한 반복 순서와 함께 Set 인터페이스의 ash 테이블 및 연결 목록 구현. 이 구현은 모든 항목을 통해 실행되는 이중 연결 목록을 유지한다는 점에서 HashSet과 다릅니다.

그러나 하위 클래스 이후 HashSet에만 가능LinkedHashSetLinkedHashSetHashSet


답변

Set는 집합과 유사한 컬렉션에 대한 일반적인 인터페이스이며 HashSet은 Set 인터페이스의 특정 구현입니다 (해시 코드를 사용하므로 이름).


답변

Set는 TreeSet, LinkedHashSet 등과 같은 모든 집합 클래스의 부모 인터페이스입니다.

HashSet은 Set 인터페이스를 구현하는 클래스입니다.


답변

HashSet은 Set 인터페이스에서 파생 된 클래스입니다. Set의 파생 클래스로서 HashSet은 Set의 속성을 얻습니다. 중요하고 가장 자주 사용되는 Set 파생 클래스는 HashSet 및 TreeSet입니다.