본문 바로가기

Java/기본

[Java] 컬렉션프레임워크105 - Map 컬렉션

Map 개요

키(key)와 값(value)으로 구성된 Map.Entry객체를 저장하는 데이터 집합이다. key는 중복될 수 없지만, value는 중복을 허용한다.

 

Map 컬렉션의 구현 클래스

EnumMap, HashMap, Hashtable, LinkedHashMap, Properties, TreeMap

 

HashTable -Key, Value는 null 이 될 수 없다. key는 중복 불가능
-스레드 동기화를 지원한다
HashMap -Key, Value에 null을 허용한다(1개씩만)
-스레드 동기화 지원하지 않는다

 

주요 메서드

메서드 내용
void clear() key와 value로 연결된 모든 mapping 삭제
boolean containsKey(Object key) key 를 가지고 있는지 여부
boolean containsValue(Object value) 개수에 상관없이 value를 가지고 있는지 여부
Set<Map.Entry<K,V>> entrySet() Map.Entry형식의 Set 객체 리턴하기
boolean equals(Object o) 동일한 Object인지 여부
V get(Object key) 특정 key 와 매핑된 value 리턴. 없으면 null
boolean isEmpty() Map이 비어있는지 여부
Set<K> keySet() Key값으로 이루어진 Set 리턴
V put(K key, V value) 특정 key-value값의 mapping 삽입하기
이미 key값이 있으면 새로운 value값으로 대체
default V putIfAbsent(K key, V value) key에 매핑된 value값이 없거나 null 이라면 새로운 값을 넣고 null 리턴,
매핑되어있으면 현재값 반환
V remove(Object key) key 값에 해당하는 매핑 삭제
default V replace(K key, V value) 특정 key-value값의 mapping 대체하기
default boolean replace(
K key, V oldValue, V newValue)
key의 매핑이 oldValue 에 해당할 경우에만 newValue로 대체하기
int size() Map 크기 리턴
Collection<V> values() Value를 Collection 형태로 반환

 


HashMap

HashMap 은 해시함수를 이용해 Map 내부에 key-value 매핑을 저장한다. Map 내부의 매핑 순서는 보장되지 않는다.

HashMap 의 성능에 영향을 주는 요인이 2개 있다. initial capacityload factor 라는 것인데, intial capacity 는 HashMap 을 생성하며 초기에 설정한 용량을 말한다. 만약 설정한 용량의 범위를 넘어서게 되면 Map은 자동으로 크기가 증가하게 된다. Map이 자동으로 증가시키기 전에 얼마나 적재(load)할지 정해놓은 정도가 load factor 이다.

 

java docs 를 참고하면 load factor는 0.75가 디폴트 값으로 설정되어있다. 이보다 값이 크면 공간을 새로 확대하는 민감도는 감소하지만 검색비용이 높아진다고 기술되어있다.

 

HashMap의 크기가 재설정되면 hashMap은 rehash 라는 과정을 거치는데, 즉 Map의 구조가 변경되면서 다시 용량을 확대시키는 것이다. 당연히 이 과정이 많을수록 성능에 영향을 주기 때문에 설계시 고려가 필요하다.

 

 

HashMap 상속구조

 

생성 예시

Map<String, Integer> map01 = new HashMap<String, Integer>();
Map<String, Integer> map02 = new HashMap<>();

 

코드 예제

public class Test_HashMap {
    public static void main(String[] args) {
        Map<String, Integer> mapStudent = new HashMap();

        String[] strArr = {"김연아", "이용대", "박지성", "손흥민", "김자인", "류현진"};
        Integer[] intArr = {92, 12, 68, 38, 84, 25};

        //map에 값 넣기
        for(int i=0; i<strArr.length; i++){
            mapStudent.put(strArr[i], intArr[i]);
        }
		
        //keySet()메서드를 사용해 key값으로 이루어진 Set 가져오기
        Set<String> setName = mapStudent.keySet();

        for(String str : setName){
            System.out.print(str+ " ");         //김연아 손흥민 류현진 박지성 이용대 김자인
        }

        for(String str : setName){
            int score = mapStudent.get(str);
            System.out.println(str+ "의 점수 : "+ score);
        }
        /*
        김연아의 점수 : 92
        손흥민의 점수 : 38
        류현진의 점수 : 25
        박지성의 점수 : 68
        이용대의 점수 : 12
        김자인의 점수 : 84
         */
    }
}

HashTable

HashMap 과 동일한 기능을 제공한다. 단, key와 value 에 null을 허용하지 않고,

동기화(synchronized) 기능이 포함되어 멀티스레드를 지원한다는 기능만 차이가 있다.

HashTable 상속구조