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에는 자체 구현 된 Setie가 KeySet있습니다. 따라서 이것을와 혼동하지 마십시오 HashSet.
또한 요소가 버킷에 삽입되는 방식에 따라 순서가 유지됩니다. 상기 찾는 addEntry(..)방법 LinkedHashMap및 그와 비교가의 HashMap어떤 사이의 주요 차이점 강조 HashMap와 LinkedHashMap.
AFAIK는 문서화되어 있지 않으므로 "공식적으로"가정 할 수 없습니다. 그러나 현재 구현이 변경되지는 않습니다.
주문을 보장하려면 성능 전체를 자연스럽게 지불 하겠지만 맵 전체를 반복하여 선택한 주문 기능을 사용하여 정렬 된 세트에 삽입 할 수 있습니다.
keySet () 및 values ()의 순서를 가정 할 수 있다고 생각하지 않습니다.
Map에 정의되고 HashMap에서 재정의되는 두 가지 메서드의 계약을 고수하는 한 정렬되지 않은 keySet () 및 values ()를 반환하는 LinkedHashMap의 구현을 쉽게 작성할 수 있습니다.
LinkedHashMap클래스 의 전체 목적은 맵을 반복하면서 요소의 순서를 유지하는 것이며이 동작은 잘 지정되어 있습니다. 기본 클래스 사양을 준수하지 않고 서브 클래스를 작성하면 매우 잘못한 것입니다.
values()아니라으로keySet(), 내가 확장 한이 질문은을 포함합니다. 이것은 더 많은 질문이 이것으로 복제 될 수 있음을 의미합니다.