[java] HashMap 업그레이드 ! 순서 있는 HashMap ! LinkedHashMap 이란 ??
Chart 라이브러리/FLOT차트개발수집자료 2014. 8. 20. 18:25Q. LinkedHashMap 에 대해서 알아봅니다.
1. HashMap
2. LinkedHashMap
3. LInkedHashMap 의 특별한 기능 removeEldestEntry()
1. HashMap |
전에 HashMap에 대해서 알아보았었는데,
HashMap 과 매우 비슷하지만 약간 다른 LinkedHashMap 에 대해서 알아볼까 합니다.
HashMap 은 Bucket 과 Entry 를 이용해서 사용하는 클래스중 하나 인데요,
자세한 내용은 링크를 참조하여 이전 블로그 내용을 확인하시면 됩니다.
http://blog.naver.com/kiho0530/150138013167
2. LinkedHashMap |
이번 포스팅 주제인 LinkedHashMap 에 대해서 알아보겠습니다.
LinkedHashMap 은 우선 기본적으로 HashMap 을 상속받아 만들어져 있습니다.
그렇기 때문에 HashMap 과 매우 흡사하게(거의 똑같이) 만들어져 있습니다.
근데, 그냥 만들어놨을리는 없고, 무언가 차이가 있기 때문에 만들어 놓았을겁니다.
바로 그 차이는 순서라는 개념입니다.
기존 HashMap 은 <K, V> 처럼 K 를 입력하여 V 를 가져오는 방식이였습니다.
입력하는데에 있어 순서가 없기 때문에,
Iterator 를 사용하여 값을 가져올때,
어떠한 특별한 기준 없이 출력을 하게 됩니다.
HashMap<Character,Character> hashmap = new HashMap<Character,Character>();
for( int i = 0; i < 26; i++ ) { char s = (char)( 65 + i ); hashmap.put( s, s ); } for( Iterator hashitr = hashmap.values().iterator(); hashitr.hasNext(); ) System.out.print( hashitr.next() + " " );
|
결과 : D E F G A B C L M N O H I J K U T W V Q P S R Y X Z |
위 소스 실행결과, 들어간 값의 순서는 'A' ~ 'Z' 이지만,
Iterator 로 출력할때의 값은 들어간 순서가 아닌,
어떠한 순서인지 알 수 없게 나오게 됩니다.
하지만, 제가 알려드린 LinkedHashMap 을 사용하게 된다면,
Iterator 를 사용하여 가져오더라도,
입력시의 순서에 맞게 값을 가져올수 있습니다.
LinkedHashMap<Character,Character> linkmap = new LinkedHashMap<Character,Character>(); for( int i = 0; i < 26; i++ ) { char s = (char)( 65 + i ); linkmap.put( s, s ); } for( Iterator linkitr = linkmap.values().iterator(); linkitr.hasNext(); ) System.out.print( linkitr.next() + " " );
|
결과 : A B C D E F G H I J K L M N O P Q R S T U V W X Y Z |
3. LInkedHashMap 의 특별한 기능 removeEldestEntry() |
LinkedHashMap 은 HashMap 과는 다르게 순서를 가지고 있습니다.
그리고 HashMap 과는 다르게 removeEldestEntry() 라는 메소드를 가지고 있습니다.
이 메소드는 put 을 할때 불리게 되는데,
이 메소드는 기본적으로 아래와 같이 정의되어 있습니다.
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) { return false; } |
removeEldestEntry() 는 들어온 순서를 기억하고,
LinkedHashMap 에 들어온지 가장 오래된 값을 eldest 로 알고 있습니다.
아래와 같이 오버라이드 하여 사용한다면,
LinkedHashMap<Character,Character> linkmap = new LinkedHashMap<Character,Character>() { @Override
protected boolean removeEldestEntry( Entry<Character,Character> eldest ) { return size() == 6 ? true : false; } }
for( int i = 0; i < 26; i++ ) { char s = (char)( 65 + i ); linkmap.put( s, s ); }
for( Iterator linkitr = linkmap.values().iterator(); linkitr.hasNext(); ) System.out.print( linkitr.next() + " " );
|
결과 : V W X Y Z |
LinkedHashMap 의 size 가 6이 되면,
가장 오래된 값을 지우고, 그 자리에 방금 들어온 값을 대체 합니다.
입력은 'A' ~ 'Z' 까지 입력이 되지만,
map 의 size 가 6이 될때에는,
가장 오래전 값을 지우고 새 값으로 대체하게 됩니다.
그렇게 반복하게 되면 removeEldestEntry 에 정의된 값의 크기 만큼만을 저장하며,
LinkedHashMap 에 들어온 순서의 가장 최근값 5개 만을 저장하고 있습니다.
4. 결론 |
HashMap 과 LinkedHashMap 은 아주 명백한 차이를 가지고 있습니다.
두개다 다른 콜렉션에 비해서 리소스를 많이 사용한다는 단점을 가지고 있지만,
각 용도에 맞게 사용한다면, 좀더 나은 콜렉션 사용법이 되겠습니다.
'Chart 라이브러리 > FLOT차트개발수집자료' 카테고리의 다른 글
FLOTCHART 형식 설정 (0) | 2014.09.11 |
---|---|
FLOTCHART Documents (0) | 2014.09.11 |
FLOTCHART Y축 콤마 찍기, 날짜형식 설정 (0) | 2014.09.11 |
Spring jsp Ajax 적용 문제 (0) | 2014.08.27 |
Java HashMap은 어떻게 동작하는가? (0) | 2014.08.19 |
[36] servlet에서 json타입의 view 응답하기 (0) | 2014.08.19 |
jQuery를 이용한 Ajax + json (0) | 2014.08.19 |
FLOT 차트 개발중검색 (0) | 2014.08.19 |