HashMap에서 검색된 값의 순서가 삽입 순서입니다.
HashMap의 값을 검색 할 수있는 순서를 알아 내려고합니다. 다음은 동일한 코드 스 니펫입니다.
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args) {
HashMap<Integer, String> hashmap = new HashMap<Integer, String>();
hashmap.put(1, "apple" );
hashmap.put(2, "lemon" );
hashmap.put(3, "orange" );
hashmap.put(4, "banana" );
hashmap.put(5, "litchi" );
hashmap.put(6, "mango" );
hashmap.put(7, "papaya" );
System.out.println(hashmap.size());
for (String key : hashmap.values()) {
System.out.println(key);
}
}
}
산출:
7
apple
lemon
orange
banana
litchi
mango
papaya
값은 삽입 된 순서대로 인쇄됩니다. 이것은 일반적으로 사실입니까? 값이 임의의 순서로 인쇄 될 것으로 예상했습니다. 이것은 Java 6을 사용하고 있습니다.
값은 삽입 된 순서대로 인쇄됩니다. 이것은 일반적으로 사실입니까? 값이 임의의 순서로 인쇄 될 것으로 예상했습니다.
HashMap
API는 반복의 순서를 정의하지 않습니다.
그러나 HashMap의 구현을 살펴보면 반복 순서, 키의 해시 값, 키가 삽입 된 순서 및 해시 테이블 크기간에 복잡한 일시적 관계가 있음을 추론 할 수 있습니다. 이 관계는 해시 테이블의 크기가 자체적으로 조정되면 뒤섞입니다.
귀하의 경우에는 Integer
키의 해시 값이 키 값 자체임을 의미하는 키를 사용 하고 있습니다. 또한 항목을 키 순서로 삽입했습니다. 이것은 (우연히!) 게재 신청서와 일치하는 반복 순서로 이어집니다. 그러나 더 많은 키를 계속 삽입하면 반복 순서가 "순환"된다는 것을 알 수 있습니다. 그러면 테이블이 일련의 크기 조정을 거치면서 순서가 점점 더 복잡해집니다.
요컨대, 당신이보고있는 것은 해시 테이블 구현의 인공물이지 당신이 현명하게 사용할 수있는 (혹은해야하는) 것이 아닙니다. 특히 하나의 Java 릴리스에서 다음 릴리스로 변경 될 수 있기 때문 입니다.
Javadoc에서 : HashMap
"클래스는 맵의 순서에 대해 보장하지 않습니다. 특히 순서가 시간이 지남에 따라 일정하게 유지된다는 보장은 없습니다."
일관된 주문이 필요한 경우 LinkedHashMap
(삽입 / 액세스 주문 용) 또는 TreeMap
(비교 주문 용)을 사용할 수 있습니다. 이들은 값이 아닌 키의 순서를 유지합니다.
의 LinkedHashMap이 필요하시면. doco에서 모든 항목을 통해 실행되는 이중 링크 목록을 유지한다는 점에서 HashMap과 다릅니다.
순서가 중요한 경우 LinkedHashMap을 사용해보십시오 ... JavaDoc에서 참조하십시오.
공용 클래스 LinkedHashMap은 HashMap을 확장합니다.
예측 가능한 반복 순서와 함께 Map 인터페이스의 해시 테이블 및 연결 목록 구현. 이 구현은 모든 항목을 통해 실행되는 이중 연결 목록을 유지한다는 점에서 HashMap과 다릅니다. 이 연결 목록은 반복 순서를 정의하며, 일반적으로 키가 맵에 삽입 된 순서 (삽입 순서)입니다. 키가지도에 다시 삽입되는 경우 삽입 순서는 영향을받지 않습니다. (m.containsKey (k)가 호출 직전에 true를 반환 할 때 m.put (k, v)가 호출되면 키 k가 맵 m에 다시 삽입됩니다.)
관련 컬렉션은 java.util.concurrent의 ConcurrentSkipListMap 입니다. skiplist는 당신이 키 순서로 항목을 통과하며 (그러나 빨리는 HashMap 등) 임의의 순서로 볼 수 있습니다.
멋진 스킵리스트 데모 애플릿이 있습니다.
'development' 카테고리의 다른 글
VB.NET의 임의 정수 (0) | 2020.12.26 |
---|---|
경고 C4003 및 오류 C2589 및 C2059 on : x = std :: numeric_limits (0) | 2020.12.26 |
동적 조건이있는 Rails has_many (0) | 2020.12.26 |
매우 간단한 연결 목록 만들기 (0) | 2020.12.26 |
Android View layout_width-프로그래밍 방식으로 변경하는 방법? (0) | 2020.12.26 |