'removeEldestEntry()'에 해당되는 글 1건

  1. 2015.02.27 순서가 보장되는 HashMap - LinkedHashMap

데이터를 모아서 저장하고 관리하는데 있어서 많은 자료형들이 유용하게 사용됩니다.

ArrayList, Map, Vector, Stack, Queue 등등!

 

각기 다른 장점과 단점을 가지고 있지만

요새 특히 많이 사용하고 있는 것은 HashMap 입니다.

 

key 와 value 의 1:1 한쌍으로 데이터를 저장 / 관리할 수 있고

key 를 통해 저장된 value 를 손쉽게 얻어 올 수 있는 매우 유용한 자료형입니다.

(key 의 중복은 허용되지 않습니다.)

 

key 기반의 데이터 저장 구조이기 때문에 자연스럽게 저장 순서는 의미를 갖지 않게 되어서

저장된 데이터를 출력해 보면 추가했던 순서와는 전혀 다른 형태의 모습으로 여기저기 흩어져 있는 것을 확인 할 수 있습니다.

 

그런데 아주 가끔 입력한 순서대로 저장이 필요한 순간이 있습니다.

마치 ArrayList 처럼 순서대로 데이터를 입력하고 싶은 것이죠.

그럴 때 사용하는 자료형이 바로 LinkedHashMap 입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
 
public class HashMapTest {
    public static void initData(Map<StringString> map) {
        map.put("key1""1");
        map.put("key2""2");
        map.put("key3""3");
        map.put("key4""4");
        map.put("key5""5");
        map.put("key6""6");
        map.put("key7""7");
        map.put("key8""8");
        map.put("key9""9");
        map.put("key10""10");
    }
    
    public static void printResult(Map<StringString> map) {
        Set<String> set = map.keySet();
        Iterator<String> iter = set.iterator();
        while (iter.hasNext()) {
            String key = ((String)iter.next());
            String value = map.get(key);
            System.out.println("key : " + key + ", value : " + value);
        }
    }
 
    public static void main(String[] args) {
        // HashMap
        System.out.println("====== HashMap Test ======");
        Map<StringString> hashMap = new HashMap<StringString>();
        initData(hashMap);
        printResult(hashMap);
        
        // LinkedHashMap
        System.out.println("====== LinkedHashMap Test ======");
        Map<String,String> linkedHashMap=new LinkedHashMap<StringString>();
        initData(linkedHashMap);
        printResult(linkedHashMap);
    }
}
cs

 

<출력>

====== HashMap Test ======
key : key4, value : 4
key : key3, value : 3
key : key6, value : 6
key : key5, value : 5
key : key2, value : 2
key : key1, value : 1
key : key10, value : 10
key : key8, value : 8
key : key7, value : 7
key : key9, value : 9
====== LinkedHashMap Test ======
key : key1, value : 1
key : key2, value : 2
key : key3, value : 3
key : key4, value : 4
key : key5, value : 5
key : key6, value : 6
key : key7, value : 7
key : key8, value : 8
key : key9, value : 9
key : key10, value : 10

 

출력 결과에서 처럼 HashMap 은 입력된 순서와 전혀 상관 없이 데이터가 흩어져 있는 반면에

LinkedHashMap 은 입력된 순서대로 차곡차곡 데이터가 쌓여 있는 것을 확인 할 수 있습니다.

 

언뜻 보기에는 ArrayList 를 사용하는 것과 차이가 없어 보일 수 있지만

LinkedHashMap 의 경우는 HashMap 의 장점을 그대로 가지고 있기 때문에

동일한 key 의 중복을 막아주고, 특정 key 의 value 를 찾고자 할 때 for 문을 돌며 전체 값을 검색할 필요가 없습니다.

 

또한 순서대로 입력되어 있기 때문에 전체의 값을 순서대로 operation 해야 할 때도 매우 유용합니다.

 

 


 

마지막으로 LinkedHashMap 에는 특별한 기능을 가진 removeEldestEntry() 메소드가 존재합니다.

 

protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {

return false; 

}

 

이 메소드는 put() 메소드가 호출될 때 불리게 되는데 마지막으로 입력된 순서를 기억하고

LinkedHashMap 에 입력된지 가장 오래된 데이터를 파라미터로(eldest) 전달받게 됩니다.

 

1
2
3
4
5
6
7
8
9
System.out.println("====== LinkedHashMap2 Test ======");
Map<StringString> linkedHashMap2=new LinkedHashMap<StringString>() {
    @Override
    protected boolean removeEldestEntry(Entry<StringString> arg0) {
        return size() == 6true : false;
    }
};
initData(linkedHashMap2);
printResult(linkedHashMap2);
cs

 

따라서 removeEldestEntry() 메소드를 오버라이드(override) 해서 다음과 같이 사용하면

6번째 데이터가 입력될 때, 입력된지 가장 오래된 데이터(1번째 데이터)가 삭제되고

linkedHashMap2 의 최대 입력 갯수는 5 가 되게 됩니다. (지정된 크기의 데이터만 입력 가능합니다.)

 

<출력>

====== LinkedHashMap2 Test ======
key : key6, value : 6
key : key7, value : 7
key : key8, value : 8
key : key9, value : 9
key : key10, value : 10

 

Posted by maze1008
,