프로그래밍 공부

자바 컬렉션 - Map 본문

Programming/JAVA

자바 컬렉션 - Map

khj1999 2024. 10. 8. 08:28

Map

  • 자바에서 Map은 키-값 쌍을 저장하는 데이터 구조로, 특정 키에 대한 값을 효율적으로 저장하고 검색할 수 있도록 설계됨
  • Map 인터페이스는 다양한 구현체를 가지고 있으며, 각각의 구현체는 서로 다른 특성과 성능을 제공함.
  • Collection 프레임워크의 일부지만 Collection 인터페이스를 구현하지는 않음
  • HashMap
    • 해시맵은 열쇠를 Null값과 저장할 수 있게 해줌
    • 정렬되지 않고 순서가 없음
  • HashTable
    • Hashtable은 Vector와 비슷함, 동기화가 되어있음
      스레드가 해시맵에 비해 더 안전하고, 분류되어 있지도 순서가 있지도 않음
  • LinkedHashMap
    • 삽입 순서가 유지됨, 정렬되어 있지는 않음
    • 해시맵보다 삽입 삭제 속도는 느림
    • 요소간 연결이 있어서 이터레이션은 훨씬 빠름
  • TreeMap
    • 정럴된 상태로 데이터가 저장됨

1. Map 인터페이스

Map 인터페이스는 키와 값을 매핑하는 메서드를 정의하며, 주요 메서드는 다음과 같다:

  • put(K key, V value): 지정된 키와 값을 맵에 추가.
  • get(Object key): 지정된 키에 대한 값을 반환합니다. 키가 존재하지 않으면 null을 반환.
  • remove(Object key): 지정된 키와 그에 해당하는 값을 제거.
  • containsKey(Object key): 맵에 지정된 키가 존재하는지 확인.
  • keySet(): 맵에 있는 모든 키의 집합(Set)을 반환.
  • values(): 맵에 있는 모든 값의 컬렉션(Collection)을 반환.
  • entrySet(): 맵에 있는 모든 키-값 쌍의 집합(Set)을 반환.

2. Map의 주요 구현체

2.1. HashMap

  • 특징: 해시 테이블을 기반으로 구현되어 있으며, 키의 해시 값을 이용하여 요소를 저장.
  • 특징: 순서가 보장되지 않으며, 키와 값에 null을 허용.
  • 성능: 평균적으로 O(1)의 시간 복잡도를 가짐.

예제:

import java.util.HashMap;

public class HashMapExample {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();
        map.put("Apple", 1);
        map.put("Banana", 2);

        System.out.println(map.get("Apple")); // 1
        System.out.println(map.containsKey("Banana")); // true
    }
} 

2.2. LinkedHashMap

  • 특징: HashMap의 기능을 확장하여, 요소를 추가한 순서대로 유지.
  • 사용 용도: 삽입 순서를 유지해야 할 때 유용함.
  • 성능: 평균적으로 O(1)의 시간 복잡도를 짐.

예제:

import java.util.LinkedHashMap;

public class LinkedHashMapExample {
    public static void main(String[] args) {
        LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
        map.put("Apple", 1);
        map.put("Banana", 2);

        for (String key : map.keySet()) {
            System.out.println(key + ": " + map.get(key));
        }
    }
}

2.3. TreeMap

  • 특징: 정렬된 키를 유지하며, 이진 검색 트리를 기반으로 구현됨.
  • 사용 용도: 키를 정렬된 상태로 저장해야 할 때 유용함.
  • 성능: O(log n)의 시간 복잡도를 가짐.
  • 키에 null을 허용하지 않음.
  • TreeMap 전용 메서드
    • firstKey()
      • 설명: 맵에서 가장 작은 키를 반환.
      • 예제: String first = treeMap.firstKey();
    • lastKey()
      • 설명: 맵에서 가장 큰 키를 반환.
      • 예제: String last = treeMap.lastKey();
    • higherKey(K key)
      • 설명: 지정된 키보다 큰 키 중에서 가장 작은 키를 반환. 존재하지 않으면 null을 반환.
      • 예제: String higher = treeMap.higherKey("Banana");
    • lowerKey(K key)
      • 설명: 지정된 키보다 작은 키 중에서 가장 큰 키를 반환. 존재하지 않으면 null을 반환.
      • 예제: String lower = treeMap.lowerKey("Banana");
    • ceilingKey(K key)
      • 설명: 지정된 키보다 크거나 같은 키 중에서 가장 작은 키를 반환. 존재하지 않으면 null을 반환.
      • 예제: String ceiling = treeMap.ceilingKey("Banana");
    • floorKey(K key)
      • 설명: 지정된 키보다 작거나 같은 키 중에서 가장 큰 키를 반환. 존재하지 않으면 null을 반환
      • 예제: String floor = treeMap.floorKey("Banana");
    • subMap(K fromKey, K toKey)
      • 설명: 지정된 키 범위에 해당하는 서브맵을 반환. fromKey는 포함되고 toKey는 포함되지 않음.
      • .예제: SortedMap<String, Integer> subMap = treeMap.subMap("Apple", "Cherry");
    • headMap(K toKey)
      • 설명: 지정된 키보다 작은 모든 키-값 쌍을 포함하는 맵을 반환.
      • 예제: SortedMap<String, Integer> headMap = treeMap.headMap("Banana");
    • tailMap(K fromKey)
      • 설명: 지정된 키와 그보다 큰 모든 키-값 쌍을 포함하는 맵을 반환.
      • 예제: SortedMap<String, Integer> tailMap = treeMap.tailMap("Banana");
    • Key대신 Entry를 쓰면 Map.Entry 객체를 반환
      • Map.Entry<K, V> ← 리턴 타입
      • 키와 값 모두 필요할 때 사용
      • firstEntry(), higherEntry(K key) 등등이 있음

예제:

import java.util.TreeMap;

public class TreeMapExample {
    public static void main(String[] args) {
        TreeMap<String, Integer> map = new TreeMap<>();
        map.put("Banana", 2);
        map.put("Apple", 1);

        for (String key : map.keySet()) {
            System.out.println(key + ": " + map.get(key));
        }
    }
}

2.4. Hashtable

  • 특징: HashMap과 유사하지만, 동기화되어 멀티스레드 환경에서 안전함.
  • 사용 용도: 스레드 안전이 필요한 경우 사용합니다. 그러나 성능이 떨어질 수 있음.
  • 성능: 평균적으로 O(1)의 시간 복잡도를 가짐.

예제:

import java.util.Hashtable;

public class HashtableExample {
    public static void main(String[] args) {
        Hashtable<String, Integer> table = new Hashtable<>();
        table.put("Apple", 1);
        table.put("Banana", 2);

        System.out.println(table.get("Apple")); // 1
    }
}

요약

  • Map 인터페이스는 키-값 쌍을 저장하는 데이터 구조임.
  • 주요 구현체: HashMap, LinkedHashMap, TreeMap, Hashtable이 있으며, 각각 특성과 성능이 다름.
    • HashMap: 빠른 성능, 순서 없음.
    • LinkedHashMap: 삽입 순서 유지.
    • TreeMap: 정렬된 키 유지.
    • Hashtable: 스레드 안전.

'Programming > JAVA' 카테고리의 다른 글

자바 제네릭  (0) 2024.10.09
자바 컬렉션 - 객체 정렬  (0) 2024.10.09
자바 컬렉션 - Queue, PriorityQueue  (0) 2024.10.08
자바 컬렉션 - Set 인터페이스  (0) 2024.10.08
자바 컬렉션 - List 인터페이스  (3) 2024.10.08
Comments