2014-09-11 3 views
1

값을 가져올 때 삽입 순서가 바뀌는 LinkedHashMap이 있습니다. 어떤 아이디어? 에서 LinkesHashMap 이동에 삽입 DAO, 중LinkedHashMap이 키순으로 정렬됩니다.

private final Map<Long, DD> cachedPlansById=new LinkedHashMap<Long, DD>(); 
cachedPlansById.put(dd.getId(), dd); 

값이 순서 ->

dao Spring 6 
dao Fall 5 
dao Annual 4 
dao Spring 2010 3 
dao Fall 2009 2 
dao Annual 2010-2011 1 

하지만 LinkedHashMap에서 그들을 검색 할 때, 그들은 this->

valu Annual 2010-2011 1 
valu Fall 2009 2 
valu Spring 2010 3 
valu Annual 4 
valu Fall 5 
valu Spring 6 
같은 순서가있어

나는 루프이 사용

for (Map.Entry<Long, PaymentPlan> m:cachedPlansById.entrySet()){ 
     System.out.println("valu "+m.getValue().getName()+" "+m.getValue().getId()); 
} 
+1

재현 가능한 예를 제공하십시오. –

+0

그래서 문제는 LinkedHashMap이 LinkedHashMap이 아닌 HashMap의 instanceof입니까? – JayB

답변

2

값을 삽입하는 부분에 코드를 제공해 주시겠습니까?

이 작은 예제를 사용하면 반복자 LinkedHashMap이 삽입 순서를 따르고 있기 때문입니다.

Map<Long, String> cachedPlansById = new LinkedHashMap<Long, String>(); 
    cachedPlansById.put(6L, "Spring"); 
    cachedPlansById.put(5L, "Fall"); 
    for (Map.Entry<Long, String> m : cachedPlansById.entrySet()) { 
     System.out.println(m.getValue() + " " + m.getKey()); 
    } 

결과는 다음

Spring 6 
Fall 5 

단지 정보, LinkedHashMap도 대신 삽입 순서의 액세스 순서를 다음 생성자를 갖는다.

특별한 생성자는 그 위해 반복의 항목에서 최소 최근 가장 최근에 (액세스 순서)에 접속, 마지막으로 액세스하는 순서입니다 링크 해시 맵을 만들 수 있도록 제공됩니다. 이러한 종류의 맵은 LRU 캐시를 구축하는 데 적합합니다. put 또는 get 메소드를 호출하면 해당 항목에 액세스 할 수 있습니다 (호출 후 이 완료된 것으로 가정). putAll 메소드는, 지정된 맵의 엔트리 세트 반복자가 제공하는 키와 값의 매핑이 인 순서로, 지정된 MAP 내의 각 매핑에 대해 1 개의 엔트리 액세스를 생성합니다. 다른 방법은 입력 액세스를 생성하지 않습니다. 특히, 콜렉션 뷰 에 대한 작업은 백업 맵의 반복 순서에 영향을주지 않습니다.

+0

내 출력이 삽입 순서의 반대이므로 액세스 순서 생성자를 호출하는 것 같습니다. 내가 추측 한 삽입 순서 생성자를 호출해야합니다. 감사. 그리고 맵에 항목을 넣는 코드를 확인하고, 퍼팅하기 전에 키와 값을 출력하므로 올바른 순서인지 알 수 있습니다. – JayB

+0

나는 이것이 문제라고 생각하지 않는다. 액세스 순서 생성자를 호출하기 위해서는'Map cachedPlansById = new LinkedHashMap (5, 5f, true);를 호출했을 것입니다. –

+0

나는 내가 생각하는 문제를 생각했다. HashMap의 instanceof를 실행했지만, true를 반환했지만, LinkedHashMap의 instanceof를 수행하면 false를 반환합니다. 확실하지 왜 그 HashMap 인스턴스. 그리고 put 문에 값을 삽입합니다. – JayB

관련 문제