LinkedHashMap
예측 가능한 반복 순서 (삽입 순서)가 있다는 것을 알고 있습니다. 는 않습니다 Set
에 의해 반환 LinkedHashMap.keySet()
과은 Collection
에 의해 반환 LinkedHashMap.values()
이 질서를 유지?
LinkedHashMap
예측 가능한 반복 순서 (삽입 순서)가 있다는 것을 알고 있습니다. 는 않습니다 Set
에 의해 반환 LinkedHashMap.keySet()
과은 Collection
에 의해 반환 LinkedHashMap.values()
이 질서를 유지?
답변:
Map 인터페이스는 세 개의 콜렉션보기 를 제공하여 맵 컨텐츠를 키 세트, 값 콜렉션 또는 키-값 맵핑 세트로 볼 수 있습니다. 위해 지도의이지도의 코레 크 션뷰의 반복자가 요소를 돌려 줄 때의 순서로서 정의된다.
TreeMap
클래스 와 같은 일부지도 구현 은 순서에 대해 구체적으로 보증합니다.HashMap
수업 과 같은 다른 사람들 은 그렇지 않습니다.
- 지도
이 링크 된 목록은 반복 순서를 정의하며, 일반적으로 키가 맵에 삽입 된 순서입니다 ( insertion-order ).
그래서, 예 keySet()
, values()
및 entrySet()
순서 내부 링크리스트의 사용을 복귀 값 (세 컬렉션 뷰 언급). 그리고 네, JavaDoc을위한 Map
과 LinkedHashMap
를 보장합니다.
이것이 바로이 수업의 요점입니다.
Collection
은 values ()가 반환하는 기본 클래스입니다. 그것이 반환하는 Collection의 구현은 여전히에 의해 제어됩니다 LinkedHashMap
. 년 LinkedHashMap
의 경우, 그것은 반환있어 LinkedValues
예, LinkedHashMap.java 내부에 private 클래스를.
Map
지도의 순서를지도의 컬렉션보기에서 반복자와 명시 적으로 연결하고 해당 컬렉션보기가 무엇인지 명확하게 설명하는 문서 (에서 ) 를 연결해 주셔서 감사합니다 . 그것은 저에게 없어진 부분이었습니다.
소스를 살펴보면 마치 소스처럼 보입니다. 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
.
AFAIK는 문서화되어 있지 않으므로 "공식적으로"가정 할 수 없습니다. 그러나 현재 구현이 변경되지는 않습니다.
주문을 보장하려면 성능 전체를 자연스럽게 지불 하겠지만 맵 전체를 반복하여 선택한 주문 기능을 사용하여 정렬 된 세트에 삽입 할 수 있습니다.
keySet () 및 values ()의 순서를 가정 할 수 있다고 생각하지 않습니다.
Map에 정의되고 HashMap에서 재정의되는 두 가지 메서드의 계약을 고수하는 한 정렬되지 않은 keySet () 및 values ()를 반환하는 LinkedHashMap의 구현을 쉽게 작성할 수 있습니다.
LinkedHashMap
클래스 의 전체 목적은 맵을 반복하면서 요소의 순서를 유지하는 것이며이 동작은 잘 지정되어 있습니다. 기본 클래스 사양을 준수하지 않고 서브 클래스를 작성하면 매우 잘못한 것입니다.
values()
아니라으로keySet()
, 내가 확장 한이 질문은을 포함합니다. 이것은 더 많은 질문이 이것으로 복제 될 수 있음을 의미합니다.