Colllection Framework - Map

Map Interface

Key와 Value를 하나의 쌍으로 묶어서 저장하는 클랙션 클래스를 구현하는데 사용한다. Key는 Value와 매칭되기 때문에 Key는 중복이 불가능하고, Value는 중복이 가능하다. 기존에 저장된 Key에 새로운 Value를 저장하면 새로운 Value로 덮어쓰여 진다. Hashtable, HashMap, LinkedHashMap, SortedMap, TreeMap등이 있다.


  Method 

  설명

 void clear()

 Map의 모든 객체를 삭제한다.

 boolean containsKey(Object key)

 지정된 Key객체와 일치하는 Map의 Key객체가 있는지 확인.

 boolean containsValue(Object value)

 지정된 Value객체와 일치하는 Map의 Value객체가 있는지 확인.

 Set entrySet()

 Map에 저장되어 있는 Key-Value쌍을 Map.Entry타입의 객체로 저장한 Set을 반환.

 boolean equals(Object o)

 동일한 Map인지 비교. 

 Object get(Obejct key)

 지정한 key에 해당하는 Value객체를 리턴. 

 int hashCode()

 hashcode를 반환. 

 boolean isEmpty()

 Map이 비어있는지 확인. 

 Set keySet() Map에 지정된 모든 Key객체를 반환한다.
(Key는 중복이 불가하기 때문에 Set으로 반환) 

 Object put(Object key, Object value)

 Map에 value객체를 key객체에 매핑하여 저장. 
 void putAll(Map t)

 지정된 Map의 모든 key-value쌍을 추가. 

 Object remove(Object key)

 지정된 key 객체와 일치하는 key-value쌍을 삭제한다. 

 int size()

 Map에 저장된 key-value쌍의 개수를 반환한다. 

 Collection values()

 Map에 저장된 모든 value객체를 반환한다. 

(value는 중복이 가능하기 때문에 Collection으로 반환)



Map.Entry Interface

Map인터페이스의 inner Interface로 key-value쌍을 다루기위해 내부적으로 사용하는 Interface이다. 즉 Map에서 데이터가 추가 되는 경우 새로운 Entry객체를 생성하여 key-value를 저장처리 하고 있다. Map인터페이스의 entrySet()메소드를 통해서 Entry타입으로 정의 된 Set을 리턴 받을 수 있으며 Map에 저장된 key-value쌍의 순회가 필요한 경우 주로 사용된다.


  Method

  설명

 boolean equals(Object o)

 동일한 Entry인지 비교. 

 Object getKey()

 Entry의 key객체를 반환. 

 Object getValue()

 Entry의 value객체를 반환. 

 int hashCode()

 Entry의 hashcode를 반환. 

 Object setValue(Object value)

 Entry의 value객체 지정된 객체로 변경. 



HashMap

HashMap은 hashing을 사용하여 데이터를 검색하는 Map클래스이다. hashing을 사용하기 때문에 다른 Map클래스 보다 접근 속도가 빠른 것이 특징이다. 대신 데이터가 저장되는 입력순서와 저장되어 정렬되지 않기 때문에 정렬이 필요한 경우 TreeSet을 사용하여야 한다.


참고 : Hashtable은 jdk하위 호환성을 위해 남은 Class로 가급적 HashMap을 사용하는 것을 권장.


LinkedHashMap

HashMap을 상속받아 구현한 클래스로 기본 HashMap이 데이터 저장순서를 무시한다는 단점을 보안하기위해 사용되는 클래스이다. LinkedHashMap을 이용하는 경우 저장순서를 보장 받을 수 있다. 다만 HashMap에 비하여 성능저하는 약간 발생하지만 미미한 수준이기 때문에 굳이 순서를 유지할 필요가 없다면 HashMap을 사용하면 된다.



TreeMap

이진검색트리를 이용하여 데이터를 저장하는 메커니즘을 갖는 Map이다. 이진검색트리를 사용했기 때문에 입력순서는 보장하지 않지만, 이진검색알고리즘을 이용하여 데이터 저장시 key를 기준으로 정렬되어 입력된다. 만약, 특정 key에 대한 값을 찾는 경우는 보통 HashMap이 뛰어난 성능을 보이고, 범위 검색이나 정렬이 필요한 경우는 TreeMap이 좋다.


<TreeMap에서 key역순으로 저장하고 싶은 경우 Collections에서 제공하는 Comparator를 이용>

1
2
TreeMap<String, Integer> treeMap 
            = new TreeMap<String, Integer>(Collections.reverseOrder());    
cs



Summary

 Map 

 입력순서

 정렬순서

 특징

 HashMap

 없음

 없음 

 접근 속도 가장 빠름. 

 LinkedHashMap

 보장

 없음 

 HashMap을 상속받아 순서유지, 기능향상 

 TreeMap

 없음

 key기준 오름차순 정렬

 key기준 정렬이 필요한 경우 사용.


<Map key-value 반복(for, iterator) 예제>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
HashMap<String, Integer> hashMap = new HashMap<String, Integer>();
hashMap.put("key1"1);
hashMap.put("key2"2);
hashMap.put("key3"3);
hashMap.put("key4"4);
hashMap.put("key5"5);
 
// 방법1 : keySet을 이용 (key의 집합을 set으로 리턴 받아 for로 반복)
forString key : hashMap.keySet() ){
    System.out.println("KEY : " + key + ", VALUE : " + hashMap.get(key) );
}
 
// 방법2 : entrySet을 이용 (key-value쌍을 저장하는 entry Set을 리턴받아 for로 반복)
for( Map.Entry<String, Integer> entry : hashMap.entrySet() ){
    System.out.println("KEY : " + entry.getKey() + ", VALUE : " + entry.getValue());
}
 
// 방법3 : keySet.iterator를 이용 (방법1과 유사. for대신 iterator로 반복)
Iterator<String> keyIter = hashMap.keySet().iterator();
while( keyIter.hasNext() ){
    String tempKey = keyIter.next();
    System.out.println("KEY : " + tempKey + ", VALUE : " + hashMap.get(tempKey));
}
cs



관련글 보기

Collection Framework

List Interface : ArrayList, LinkedList, Stack and Queue

Set Interface : HashSet, LinkedHashSet, TreeSet, Comparable, Comparator

Map Interface : HashMap, LinkedHashMap, TreeMap



이 글을 공유하기

댓글

Email by JB FACTORY