[java] LinkedHashMap 객체에서 키와 값을 반환하는 순서가 보장됩니까?

LinkedHashMap예측 가능한 반복 순서 (삽입 순서)가 있다는 것을 알고 있습니다. 는 않습니다 Set에 의해 반환 LinkedHashMap.keySet()과은 Collection에 의해 반환 LinkedHashMap.values()이 질서를 유지?



답변

Map 인터페이스는 세 개의
콜렉션보기 를 제공하여 맵 컨텐츠를 키 세트, 값 콜렉션 또는 키-값 맵핑 세트로 볼 수 있습니다. 위해 지도의이지도의 코레 크 션뷰의 반복자가 요소를 돌려 줄 때의 순서로서 정의된다. TreeMap
클래스 와 같은 일부지도 구현 은 순서에 대해 구체적으로 보증합니다. HashMap수업 과 같은 다른 사람들
은 그렇지 않습니다.

지도

이 링크 된 목록은 반복 순서를 정의하며, 일반적으로 키가 맵에 삽입 된 순서입니다 ( insertion-order ).

의 LinkedHashMap

그래서, 예 keySet(), values()entrySet()순서 내부 링크리스트의 사용을 복귀 값 (세 컬렉션 뷰 언급). 그리고 네, JavaDoc을위한 MapLinkedHashMap를 보장합니다.

이것이 바로이 수업의 요점입니다.


답변

소스를 살펴보면 마치 소스처럼 보입니다. 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에는 자체 구현 된 Setie가 KeySet있습니다. 따라서 이것을와 혼동하지 마십시오 HashSet.

또한 요소가 버킷에 삽입되는 방식에 따라 순서가 유지됩니다. 상기 찾는 addEntry(..)방법 LinkedHashMap및 그와 비교가의 HashMap어떤 사이의 주요 차이점 강조 HashMapLinkedHashMap.


답변

당신은 그렇게 생각할 수 있습니다. Javadoc은 ‘예측 가능한 반복 순서’라고 말하고 Map에서 사용 가능한 유일한 반복자 는 다음과 같습니다. () 키 집합 (), entrySet () 및 값에 대한 그.

따라서 추가 자격이 없으면 모든 반복자에 적용 할 수 있습니다.


답변

AFAIK는 문서화되어 있지 않으므로 “공식적으로”가정 할 수 없습니다. 그러나 현재 구현이 변경되지는 않습니다.

주문을 보장하려면 성능 전체를 자연스럽게 지불 하겠지만 맵 전체를 반복하여 선택한 주문 기능을 사용하여 정렬 된 세트에 삽입 할 수 있습니다.


답변

인터페이스를 보면가 아닌 일반을 반환 Set합니다 SortedSet. 따라서 보장이 없습니다.

구현을 보면서 암시 적 보증을 가정하기 전에 (항상 나쁜 생각은) 다른 모든 Java 구현의 구현도 살펴보십시오. 🙂

예를 들어 생성자에서 keySet을 사용하여 TreeSet을 더 잘 만들 수 있습니다.


답변

keySet () 및 values ​​()의 순서를 가정 할 수 있다고 생각하지 않습니다.

Map에 정의되고 HashMap에서 재정의되는 두 가지 메서드의 계약을 고수하는 한 정렬되지 않은 keySet () 및 values ​​()를 반환하는 LinkedHashMap의 구현을 쉽게 작성할 수 있습니다.