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


162

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


1
모든 해답은 문제 해결 이후 values()아니라으로 keySet(), 내가 확장 한이 질문은을 포함합니다. 이것은 더 많은 질문이 이것으로 복제 될 수 있음을 의미합니다.
Duncan Jones

답변:


226

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

- 지도

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

- 의 LinkedHashMap

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

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


8
맵에 대한 반복은 HashMap보다 LinkedHashMap을 사용하여 더 빠르게 수행됩니다.
Thierry

2
values ​​()는 컬렉션을 반환합니다. 목록이 아닙니다. 순서대로 유지하는 방법은 무엇입니까?
Dejell

7
@Dejel Collection은 values ​​()가 반환하는 기본 클래스입니다. 그것이 반환하는 Collection의 구현은 여전히에 의해 제어됩니다 LinkedHashMap. 년 LinkedHashMap의 경우, 그것은 반환있어 LinkedValues예, LinkedHashMap.java 내부에 private 클래스를.
Powerlord

2
필자의 경우 LinkedHashMap의 키 세트가 맵에 표시된 순서가 아닙니다. 이것에 매우 당황합니다.
Amalgovinus

2
Map지도의 순서를지도의 컬렉션보기에서 반복자와 명시 적으로 연결하고 해당 컬렉션보기가 무엇인지 명확하게 설명하는 문서 (에서 ) 를 연결해 주셔서 감사합니다 . 그것은 저에게 없어진 부분이었습니다.
LarsH


6

와 혼동되지 않습니다 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.


4
이 답변은 유용한 정보를 제공하지만 질문에 대한 답변은 아닙니다. 기본적으로 예측 가능한 반복 순서를 가질 수 있다고 말합니다.
Tuupertunut

5

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

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


0

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

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


entrySet ()이 keySet ()에 의한 순서를 보장하지 않는다는 것을 의미합니까?
user256239

1
@ kknight : 잘 모르겠습니다. javadoc은 "이 링크 된 목록은 반복 순서를 정의하는데, 이는 일반적으로 키가 맵에 삽입 된 순서 (삽입 순서)"입니다. 그러나 JDK 용 JavaDoc은 일반적으로 매우 모호합니다.
우리

5
entrySet ()조차도 반복 순서를 보장하지 않으면 LinkedHashMap과 HashMap의 차이점은 무엇입니까? LinkedHashMap 인스턴스에서 예측 가능한 반복 순서를 어떻게 활용할 수 있습니까?
user256239

1
그것은 가장 확실하게 되어 문서화. 답변이 완전히 틀 렸습니다.
Lorne의 후작

-3

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

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

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


3
문서를 자세히 살펴보면 실제로 보장이 있습니다. 누군가가 이미 썼 듯이, 이것이이 수업의 핵심입니다.
glglgl

-4

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

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


6
LinkedHashMap클래스 의 전체 목적은 맵을 반복하면서 요소의 순서를 유지하는 것이며이 동작은 잘 지정되어 있습니다. 기본 클래스 사양을 준수하지 않고 서브 클래스를 작성하면 매우 잘못한 것입니다.
zakinster
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.