[java] 해시 세트 대 링크 된 해시 세트

그들 사이의 차이점은 무엇입니까? 알아

LinkedHashSet은 모든 요소에서 이중 연결 List를 유지 관리하는 HashSet의 정렬 버전입니다. 반복 순서를 염려 할 때 HashSet 대신이 클래스를 사용하십시오. HashSet을 반복하면 순서를 예측할 수 없지만 LinkedHashSet을 사용하면 요소를 삽입 한 순서대로 요소를 반복 할 수 있습니다.

그러나 LinkedHashSet의 소스 코드에는 HashSet의 호출 생성자 만 있습니다. 이중 연결 목록과 게재 신청서는 어디에 있습니까?



답변

답은 생성자LinkedHashSet사용하여 기본 클래스를 구성하는 데 있습니다.

public LinkedHashSet(int initialCapacity, float loadFactor) {
    super(initialCapacity, loadFactor, true);      // <-- boolean dummy argument
}

...

public LinkedHashSet(int initialCapacity) {
    super(initialCapacity, .75f, true);            // <-- boolean dummy argument
}

...

public LinkedHashSet() {
    super(16, .75f, true);                         // <-- boolean dummy argument
}

...

public LinkedHashSet(Collection<? extends E> c) {
    super(Math.max(2*c.size(), 11), .75f, true);   // <-- boolean dummy argument
    addAll(c);
}

그리고 (의 일례) HashSet과 같이 설명한다 부울 인수를 취하고, 외모 생성자 :

/**
 * Constructs a new, empty linked hash set.  (This package private
 * constructor is only used by LinkedHashSet.) The backing
 * HashMap instance is a LinkedHashMap with the specified initial
 * capacity and the specified load factor.
 *
 * @param      initialCapacity   the initial capacity of the hash map
 * @param      loadFactor        the load factor of the hash map
 * @param      dummy             ignored (distinguishes this
 *             constructor from other int, float constructor.)
 * @throws     IllegalArgumentException if the initial capacity is less
 *             than zero, or if the load factor is nonpositive
 */
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
    map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
}


답변

LinkedHashSet의 생성자는 다음 기본 클래스 생성자를 호출합니다.

HashSet(int initialCapacity, float loadFactor, boolean dummy) {
  map = new LinkedHashMap<E, Object>(initialCapacity, loadFactor);
}

보시다시피 내부지도는입니다 LinkedHashMap. 내부를 살펴보면 LinkedHashMap다음 필드를 발견 할 수 있습니다.

private transient Entry<K, V> header;

해당 링크 목록입니다.


답변

HashSet정렬되지 않고 정렬되지 않은 집합입니다.
LinkedHashSet 은 HashSet 의 주문 버전 입니다.

HashSetLinkedHashSet 의 유일한 차이점은 다음 과 같습니다.
LinkedHashSet 은 게재 신청서를 유지합니다.

우리가 HashSet 을 반복 할 때 , LinkedHashSet의 경우 예측 가능한 반면 순서는 예측할 수 없습니다 .

LinkedHashSet이 삽입 순서를 유지 하는 방법 은 다음과 같습니다
. 기본 사용 된 데이터 구조는 Doubly-Linked-List 입니다.


답변

당신은의 소스를 보라 HashSet는 호출 생성자 … 그것을지지 해주는 특별한 생성자의 대신에 단지를 .MapLinkedHashMapHashMap


답변

전반적인 성능LinkedHashSet향상 되기 때문에 대부분의 시간 을 사용하는 것이 좋습니다 .

  1. 예측 가능한 반복 순서 LinkedHashSet (Oracle)
  2. LinkedHashSet은 HashSet보다 삽입에 더 비쌉니다.
  3. 일반적으로 HashMap반복에 Set 구조를 사용하기 때문에 일반적으로보다 약간 더 나은 성능 을 제공합니다.

성능 테스트 :

------------- TreeSet -------------
 size       add  contains   iterate
   10       746       173        89
  100       501       264        68
 1000       714       410        69
10000      1975       552        69
------------- HashSet -------------
 size       add  contains   iterate
   10       308        91        94
  100       178        75        73
 1000       216       110        72
10000       711       215       100
---------- LinkedHashSet ----------
 size       add  contains   iterate
   10       350        65        83
  100       270        74        55
 1000       303       111        54
10000      1615       256        58

여기서 소스 테스트 페이지를 볼 수 있습니다 : 최종 성능 테스트 예


답변

HashSet : 실제로 순서가 없습니다. U가 매개 변수를 전달하면

Set<Integer> set=new HashSet<Integer>();
for(int i=0;i<set.length;i++)
{
  SOP(set)`enter code here`
}

출력 : 2,1,3예측할 수 없습니다. 다음에 또 다른 주문.

LinkedHashSet() FIFO 주문을 생성합니다.


답변

HashSet 삽입 항목의 순서를 유지하지 마십시오 삽입 항목 의 순서를
LinkedHashSet 유지 하십시오

Set<String> set = ...;// using new HashSet<>() OR new LinkedHashSet<>()
set.add("2");
set.add("1");
set.add("ab");
for(String value : set){
   System.out.println(value);
}  

HashSet 산출

1
ab
2

LinkedHashSet 산출

2
1
ab