다음과 같은 코드 스 니펫을 보았습니다.
Set<Record> instances = new HashSet<Record>();
Hashset이 특별한 종류의 세트인지 궁금합니다. 그들 사이에 어떤 차이가 있습니까?
다음과 같은 코드 스 니펫을 보았습니다.
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)
.
질문에 대한 답변이 있었지만 코드가 동일한 코드에서 두 유형을 모두 언급하는 이유에 대한 답변을 보지 못했습니다.
일반적으로이 경우에는 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
에만 가능LinkedHashSet
LinkedHashSet
HashSet