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).
질문에 대한 답변이 있지만 동일한 코드에서 코드가 두 유형을 모두 언급하는 이유에 대한 답변을 보지 못했습니다.
일반적으로이 경우에는 Set 인 인터페이스에 대해 코딩하려고합니다. 왜? 항상 인터페이스를 통해 객체를 참조하는 경우 (new HashSet () 제외) 나중에 코드에서 한 번만 언급했기 때문에 객체의 구현을 변경하는 것이 더 낫다는 것을 알게되면 간단합니다. base (new HashSet ()를 한 곳).
Set은 집합과 유사한 컬렉션에 대한 일반적인 인터페이스이고 HashSet은 Set 인터페이스의 특정 구현입니다 (해시 코드를 사용하므로 이름).
집합 은 중복 요소가없는 컬렉션입니다. 세트는 인터페이스입니다.
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는 TreeSet, LinkedHashSet 등과 같은 모든 집합 클래스의 부모 인터페이스입니다.
HashSet은 Set 인터페이스를 구현하는 클래스입니다.
HashSet은 Set 인터페이스에서 파생 된 클래스입니다. Set의 파생 클래스로서 HashSet은 Set의 속성을 얻습니다. 중요하고 가장 자주 사용되는 Set 파생 클래스는 HashSet 및 TreeSet입니다.
**
- 세트:
** LIST 및 QUEUE와 마찬가지로 Collection 인터페이스의 하위 유형 인 인터페이스입니다.
Set은 3 개 이하의 하위 클래스를 가지고 있으며 중복없이 여러 객체를 저장하는 데 사용됩니다.
- HashSet
- LinkedHashSet
- TreeSet (SortedSet 인터페이스를 구현 함)
**
- HashSet :
**
하나의 NULL 값 (복제 불가)을 사용할 수 있으며, 데이터는 시퀀스를 유지하지 않기 때문에 무작위로 저장됩니다.
참고 URL : https://stackoverflow.com/questions/5139724/whats-the-difference-between-hashset-and-set
'Program Club' 카테고리의 다른 글
| Django의 self.client.login (…)은 단위 테스트에서 작동하지 않습니다. (0) | 2020.11.10 |
|---|---|
| OpenCV 이미지를 단색으로 채우는 방법은 무엇입니까? (0) | 2020.11.10 |
| Android-새 이름으로 기존 프로젝트 복사 (0) | 2020.11.10 |
| C # : DateTime.Now Month 출력 형식 (0) | 2020.11.09 |
| std :: map에 const 접근자가없는 이유는 무엇입니까? (0) | 2020.11.09 |