728x90
반응형

Q. LinkedHashMap 에 대해서 알아봅니다.






1. HashMap

2. LinkedHashMap

3. LInkedHashMap 의 특별한 기능 removeEldestEntry()





1. HashMap


전에 HashMap에 대해서 알아보았었는데,


HashMap 과 매우 비슷하지만 약간 다른 LinkedHashMap 에 대해서 알아볼까 합니다.


HashMap 은 Bucket 과 Entry 를 이용해서 사용하는 클래스중 하나 인데요,


자세한 내용은 링크를 참조하여 이전 블로그 내용을 확인하시면 됩니다.


>HashMap<

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 은 아주 명백한 차이를 가지고 있습니다.


두개다 다른 콜렉션에 비해서 리소스를 많이 사용한다는 단점을 가지고 있지만,


각 용도에 맞게 사용한다면, 좀더 나은 콜렉션 사용법이 되겠습니다.

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,