LinkedHashMap
예측 가능한 반복 순서 (삽입 순서)가 있다는 것을 알고 있습니다. 는 않습니다 Set
에 의해 반환 LinkedHashMap.keySet()
과은 Collection
에 의해 반환 LinkedHashMap.values()
이 질서를 유지?
답변
Map 인터페이스는 세 개의
콜렉션보기 를 제공하여 맵 컨텐츠를 키 세트, 값 콜렉션 또는 키-값 맵핑 세트로 볼 수 있습니다. 위해 지도의이지도의 코레 크 션뷰의 반복자가 요소를 돌려 줄 때의 순서로서 정의된다.TreeMap
클래스 와 같은 일부지도 구현 은 순서에 대해 구체적으로 보증합니다.HashMap
수업 과 같은 다른 사람들
은 그렇지 않습니다.
– 지도
이 링크 된 목록은 반복 순서를 정의하며, 일반적으로 키가 맵에 삽입 된 순서입니다 ( insertion-order ).
그래서, 예 keySet()
, values()
및 entrySet()
순서 내부 링크리스트의 사용을 복귀 값 (세 컬렉션 뷰 언급). 그리고 네, JavaDoc을위한 Map
과 LinkedHashMap
를 보장합니다.
이것이 바로이 수업의 요점입니다.
답변
소스를 살펴보면 마치 소스처럼 보입니다. keySet()
, values()
및 entrySet()
모두 내부적으로 동일한 항목 반복자를 사용합니다.
답변
와 혼동되지 않습니다 LinkedHashMap.keySet()
및 LinkedHashMap.entrySet()
반환 설정 때문에이 순서를 보장하지한다!
Set
과의 인터페이스 HashSet
, TreeSet
등 존재의 구현. HashSet
의 구현 Set
인터페이스는 순서를 보장하지 않습니다. 그러나 TreeSet
그렇습니다. 또한 LinkedHashSet
그렇습니다.
따라서 반환 Set 참조가 주문을 보장하는지 여부를 알기 Set
위해 구현 된 방법에 따라 다릅니다 LinkedHashMap
. 의 소스 코드를 LinkedHashMap
살펴 보았습니다.
private final class KeySet extends AbstractSet<K> {...}
public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E> {...}
따라서 LinkedHashMap / HashMap에는 자체 구현 된 Set
ie가 KeySet
있습니다. 따라서 이것을와 혼동하지 마십시오 HashSet
.
또한 요소가 버킷에 삽입되는 방식에 따라 순서가 유지됩니다. 상기 찾는 addEntry(..)
방법 LinkedHashMap
및 그와 비교가의 HashMap
어떤 사이의 주요 차이점 강조 HashMap
와 LinkedHashMap
.
답변
당신은 그렇게 생각할 수 있습니다. Javadoc은 ‘예측 가능한 반복 순서’라고 말하고 Map에서 사용 가능한 유일한 반복자 는 다음과 같습니다. () 키 집합 (), entrySet () 및 값에 대한 그.
따라서 추가 자격이 없으면 모든 반복자에 적용 할 수 있습니다.
답변
AFAIK는 문서화되어 있지 않으므로 “공식적으로”가정 할 수 없습니다. 그러나 현재 구현이 변경되지는 않습니다.
주문을 보장하려면 성능 전체를 자연스럽게 지불 하겠지만 맵 전체를 반복하여 선택한 주문 기능을 사용하여 정렬 된 세트에 삽입 할 수 있습니다.
답변
인터페이스를 보면가 아닌 일반을 반환 Set
합니다 SortedSet
. 따라서 보장이 없습니다.
구현을 보면서 암시 적 보증을 가정하기 전에 (항상 나쁜 생각은) 다른 모든 Java 구현의 구현도 살펴보십시오. 🙂
예를 들어 생성자에서 keySet을 사용하여 TreeSet을 더 잘 만들 수 있습니다.
답변
keySet () 및 values ()의 순서를 가정 할 수 있다고 생각하지 않습니다.
Map에 정의되고 HashMap에서 재정의되는 두 가지 메서드의 계약을 고수하는 한 정렬되지 않은 keySet () 및 values ()를 반환하는 LinkedHashMap의 구현을 쉽게 작성할 수 있습니다.