JAVA

[JAVA] 컬렉션(Collection) 정리 / Map

tudamoa 2025. 2. 27. 22:54

1. Map

Map(key)와 (value)을 매핑(Mapping) 하는 것을 구현한 인터페이스이다.

각 키(key)는 정확히 하나의 값(value)과 연결되고 키는 중복될 수 없다.

또한, 키(key)를 사용하여 Map에서 대응하는 값(value)을 가져올 수 있다.

이미 존재하는 키(key)에 새로운 값(value)를 넣는다면 기존의 값이 대체된다.

 

[특징]

1. 중복을 허용하지 않는다.

2. 순서를 보장하지 않는다.

3. 정렬을 지원하지 않는다.

4. 동기화가 불가능하다.

5. List와 비교했을 때 삽입, 삭제, 조회 연산이 매우 빠르다.

 

클래스 특징
HashMap - 삽입, 삭제, 조회의 평균 시간 복잡도가 O(1)
- 순서 보장 X
- 정렬 X
- 내부구조: HashTable
LinkedHashMap - HashMap을 상속하여 만들어짐
- 연결 리스트를 유지해야해서 연산 속도가 HashMap보다 약간 느릴 수 있음.
- 순서 보장 O
- 정렬 X
- 내부구조: HashTable + LinkedList
TreeMap - 삽입 , 삭제, 조회의 평균 시간 복잡도가 O(log N)
- 순서 보장 O
- 정렬 O
- 내부구조: Red-Black Tree

 

주요 메서드

반환 타입 메서드 설명
void clear() 해당 Map을 초기화 시킴
boolean containsKey(Object key) 해당 맵이 인자로 받은 키를 포함하고 있는지 확인
boolean containsValue(Object value) 해당 맵이 인자로 받은 값에 해당하는 1개 이상의 키를 포함하고 있는지 확인
V get(Object key) 해당 맵에서 인자로 받은 키에 대응하는 값을 반환, 없으면 null
boolean isEmpty() 해당 맵이 비어있는지 확인
Set<K> keySet() 해당 맵에 포함되어 있는 모든 키로 만들어진 Set 객체 반환
V put(key, value) 해당 맵에 전달된 키에 전달된 값으로 매핑
V remove(Object key) 해당 맵에 전달된 키의 매핑을 제거
V replace(key, value) 해당 맵에 전달된 키의 기존 값을 전달된 값으로 대체
int  size() 해당 맵의 매핑 갯수 반환

 

1. HashMap

기본적인 Map 클래스이다. 해쉬 테이블을 이용하여 구현하였다.

Map 인터페이스 중 가장 효율적이고 빠른 클래스이다.

 

기본적으로 선택.

import java.util.HashMap;
import java.util.Map;

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

        // put 메서드
        hashMap.put("a", 1);
        hashMap.put("b", 2);

        // get 메서드
        System.out.println(hashMap); // {a=1, b=2}
        System.out.println(hashMap.get("a")); // 1

        // remove 메서드
        hashMap.remove("b");
        System.out.println(hashMap.get("b")); // null

        // replace 메서드
        hashMap.replace("a", 5);
        System.out.println(hashMap.get("a")); // 5

        // size 메서드
        hashMap.put("b", 2);
        System.out.println(hashMap.size()); // 1 | {a = 5, b = 2}

        // keySet() 메서드
        System.out.println(hashMap.keySet()); // [a, b]
    }
}

 

2. LinkedHashMap

HashMap과 큰 차이는 없지만, 입력된 Key의 순서가 중요할 때 사용하는 Map이다.

LinkedHashMap은 입력된 순서에 따라 연결 리스트 구조를 만들어서 순서를 유지한다.

 

입력된 순서를 유지하고 싶을 때 선택

 

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

public class Sample {
    public static void main(String[] args) {
        Map<String, Integer> hashMap = new HashMap<>();
        Map<String, Integer> LinkedhashMap = new LinkedHashMap<>();

        hashMap.put("b", 2);
        hashMap.put("c", 3);
        hashMap.put("a", 1);
        hashMap.put("d", 4);
        
        LinkedhashMap.put("b", 2);
        LinkedhashMap.put("c", 3);
        LinkedhashMap.put("a", 1);
        LinkedhashMap.put("d", 4);

        System.out.println(hashMap); // {a=1, b=2, c=3, d=4} 입력 순서 보장 X
        System.out.println(LinkedhashMap); // {b=2, c=3, a=1, d=4} 입력 순서 보장 O
    }
}

 

3. TreeMap

이진 탐색 트리를 기반으로 키(key)와 값(value)을 정렬하여 저장할 수 있는 Map 클래스이다.

TreeMap에 요소를 저장하면 키(key)가 자동 정렬이 된다. (기본 오름차순) / Comparator 기준으로 정렬도 가능하다.

정렬을 하고 있기에 기본적으로 다른 Map 클래스보다 삽입/삭제가 오래걸린다.

 

정렬된 상태를 유지하면서 데이터를 조회할 경우가 많다면,
이진 탐색 트리를 기반으로한 TreeMap이 가장 효율적이다.

 

기본적으로 HashMap의 사용 방법과 유사하고 정렬과 관련한 메서드가 추가되었다.

 

정렬된 상태를 유지하고, 데이터를 조회할 경우가 많을 때 선택.

import java.util.TreeMap;

public class Sample {
    public static void main(String[] args) {
        TreeMap<Integer, String> map = new TreeMap<>();
        map.put(3, "a");
        map.put(2, "b");
        map.put(1, "c");
        map.put(5, "d");
        map.put(4, "e");

        System.out.println(map.keySet()); // [1, 2, 3, 4, 5]
    }
}
import java.util.TreeMap;

public class Sample {
    public static void main(String[] args) {
        TreeMap<String, Integer> map = new TreeMap<>();
        map.put("c", 1);
        map.put("b", 2);
        map.put("a", 3);
        map.put("e", 4);
        map.put("d", 5);

        System.out.println(map.keySet()); // [a, b, c, d, e]
    }
}

 

 

TreeMap은 정렬된 상태를 유지하기 때문에 범위 기반 연산이 가능하다.

import java.util.TreeMap;

public class Sample {
    public static void main(String[] args) {
        TreeMap<Integer, String> map = new TreeMap<>();
        map.put(3, "a");
        map.put(2, "b");
        map.put(1, "c");
        map.put(5, "d");
        map.put(4, "e");

        System.out.println(map.lastKey()); // 5 (가장 큰 키)
        System.out.println(map.lastEntry()); // 5=d (키:값 쌍으로 반환)
        System.out.println(map.firstKey()); // 1 (가장 작은 키)
        System.out.println(map.headMap(3).keySet()); // [1, 2] (3보다 작은 키들)
        System.out.println(map.tailMap(3).keySet()); // [3, 4, 5] (3 이상인 키들)
    }
}

 

출처

https://coding-factory.tistory.com/557

https://www.baeldung.com/java-collections

https://00h0.tistory.com/55

'JAVA' 카테고리의 다른 글

[JAVA] ORM 이란?  (0) 2025.05.31
[JAVA] JDBC 정리  (0) 2025.05.27
[JAVA] 스레드(Thread) 정리  (0) 2025.03.01
[JAVA] 컬렉션(Collection) 정리 / List, Set, Queue  (0) 2025.02.24
[JAVA] 래퍼 클래스(Wrapper Class) 정리  (1) 2025.02.16