그들 사이의 차이점은 무엇입니까? 알아
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 의 주문 버전 입니다.
HashSet 과 LinkedHashSet 의 유일한 차이점은 다음 과 같습니다.
LinkedHashSet 은 게재 신청서를 유지합니다.
우리가 HashSet 을 반복 할 때 , LinkedHashSet의 경우 예측 가능한 반면 순서는 예측할 수 없습니다 .
LinkedHashSet이 삽입 순서를 유지 하는 방법 은 다음과 같습니다
. 기본 사용 된 데이터 구조는 Doubly-Linked-List 입니다.
답변
당신은의 소스를 보라 HashSet
는 호출 생성자 … 그것을지지 해주는 특별한 생성자의 대신에 단지를 .Map
LinkedHashMap
HashMap
답변
전반적인 성능LinkedHashSet
이 향상 되기 때문에 대부분의 시간 을 사용하는 것이 좋습니다 .
- 예측 가능한 반복 순서 LinkedHashSet (Oracle)
- LinkedHashSet은 HashSet보다 삽입에 더 비쌉니다.
- 일반적으로
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