관리 메뉴

Rootable의 개발일기

Map 본문

Java

Map

dev-rootable 2024. 5. 11. 17:57

 

📌 Map

 

Key와 Value를 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스

 

  • 값은 중복해서 저장할 수 있지만, 키는 중복되어서는 안 된다.
  • 만약 기존에 저장된 데이터와 중복된 키와 값을 저장하면 기존의 값은 없어지고 최근에 저장된 값이 남게 된다.
  • 저장 순서가 유지되지 않는다.

 

✅ Methods

 

Method Description
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(Object key) 지정된 key 객체에 대응하는 value 객체를 찾아서 반환
int hashCode() 해시코드 반환
boolean isEmpty() Map이 비어있는지 확인
Set keySet() Map에 저장된 모든 key 객체를 반환
Object put(Object key, Object value) Map에 value 객체를 key 객체에 연결(mapping)하여 저장
void putAll(Map t) 지정된 Map의 모든 key-value 쌍을 추가
Object remove(Object key) 지정한 key 객체와 일치하는 key-value 객체를 삭제
int size() Map에 저장된 key-value 쌍의 개수를 반환
Collection values() Map에 저장된 모든 value 객체를 반환

 

Key는 중복을 허용하지 않기 때문에 Set 타입으로 반환하고, Value는 중복을 허용하므로 Collection 타입으로 반환하는 것을 볼 수 있다.

 

✅ Map.Entry 인터페이스

 

Map 인터페이스의 내부 인터페이스다. Map에 저장되는 key-value 쌍을 다루기 위해 내부적으로 Entry 인터페이스를
정의해 둔 것
이다. 이것은 보다 객체지향적으로 설계하도록 유도하기 위한 것으로 Map 인터페이스를 구현하는 클래스에서는 Map.Entry 인터페이스도 함께 구현해야 한다.

 

Method Description
boolean equals(Object o) 동일한 Entry인지 비교
K getKey() Entry의 Key 객체를 반환
V getValue() Entry의 Value 객체를 반환
int hashCode() Entry의 해시코드 반환
V setValue(V value) Entry의 value 객체를 지정된 객체로 변경

 

❓ Map의 Iterator 얻는 방법

 

Map 인터페이스를 구현한 컬렉션 클래스는 key-value 쌍으로 저장하고 있기 때문에 iterator()를 직접 호출할 수 없고, keySet()이나 entrySet()과 같은 메서드를 통해서 키와 값을 각각 따로 Set 형태로 얻어 온 후에 다시 iterator()를
호출해야 Iterator를 얻을 수 있다.

 

Map map = new HashMap();
...
Iterator it = map.entrySet().iterator();

 

❓ Map.get(key) vs Map.getOrDefault(key, default)

 

Map.get은 키에 대한 값을 리턴하며, Null 값인 경우 NPE가 발생한다. 반면, Map.getOrDefault키가 존재하지
않을 경우 default 값을 리턴
하므로 NPE가 발생하지 않는다.

 

public class UpdateValueOfHashMap {

    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("apple", 1);
        map.put("melon", 2);
        map.put("kiwi", 3);
        
        map.put("melon", map.getOrDefault("melon", 0) + 10);
        map.put("banana", map.getOrDefault("banana", 0) + 10);
        
        System.out.println("Result: " + map);
    }
    
}

 

키 값이 존재하는 melon은 2 + 10이 되었고, 키가 존재하지 않는 banana는 0 + 10이 되었다.

 

📖 종류

 

 ✅ HashMap

 

해싱 기능을 장착한 Map

 

  • 배열과 연결이 결합된 Hashing 형태로, 키와 값을 묶어 하나의 데이터(Entry)로 저장
  • 중복 x, 순서 x
  • 키와 값으로 Null 허용
  • 추가/삭제/검색/접근성이 모두 뛰어나다.
  • Thread-unsafe (멀티 스레드 환경 ➡ ConcurrentHashMap 권장)

 

✅ LinkedHashMap

 

Entry들이 연결 리스트를 구성하여 순서를 보장하는 Map

 

✅ TreeMap

 

정렬이 가능한 Map

 

  • 이진 검색 트리(binary search tree) 형태로 key-value 쌍을 저장
  • 키는 저장과 동시에 자동(기본) 오름차순 정렬
    • Key 값 기준 정렬
    • 정렬되는 순서: 숫자 ➡ 알파벳 대문자 ➡ 알파벳 소문자 ➡ 한글
  • 검색에 관한 한 대부분의 경우에서 HashMap이 TreeMap보다 더 뛰어남
    • 키와 값을 저장하는 동시에 정렬을 행하기 때문에 저장 시간이 다소 오래 걸림
  • 다만, 범위 검색이나 정렬이 필요한 경우에는 TreeMap이 효율성 면에서 좋음

 

🔍 Red-Black Tree

 

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

 

TreeMap은 기존의 이진 탐색 트리의 문제점을 보완한 Red-Black Tree로 이루어져 있다.

 

일반적인 이진 탐색 트리는 트리 높이만큼 접근 시간이 필요하다. 값이 전체 트리에 잘 분산되어 있다면 효율성에 있어 크게
문제가 없으나 데이터가 편향되어 들어올 경우 한쪽으로 크게 치우쳐진 트리가 되어 굉장히 비효율적인 성능(O(N))을 보인다.
이러한 문제를 보완하기 위해 Red-Black Tree를 사용한다.

 

Red-Black Tree데이터의 추가나 삭제 시 트리가 한쪽으로 치우쳐지지 않도록 균형을 맞춘다. 그래서 최악의 경우에도 O(logN) 시간 안에 검색, 삽입, 삭제 연산이 가능하도록 해준다.

 

 

✅ HashTable

 

Key를 특정 해시 함수를 통해 해싱한 후 나온 결과를 배열의 인덱스로 사용하여 Value를 찾는 자료구조

 

  • 자바 초기 버전에 나온 레거시 클래스
  • HashMap보다는 느리지만 Thread-safe 기본 지원
  • 키와 값으로 Null 허용 x

 

✅ Properties

 

HashTable을 상속받아 구현한 것으로 <String, String> 형태로 저장하는 보다 단순화된 key-value 컬렉션

 

주로 애플리케이션의 환경설정과 관련된 속성을 저장하는 데 사용되며, 데이터를 파일로부터 읽고 쓰는 편리한 기능을 제공

 

특징으로 저장 순서를 유지하지 않는다.

 

 

References:

 

https://inpa.tistory.com/entry/JCF-%F0%9F%A7%B1-Collections-Framework-%EC%A2%85%EB%A5%98-%EC%B4%9D%EC%A0%95%EB%A6%AC#linkedlist_%ED%81%B4%EB%9E%98%EC%8A%A4-1

 

🧱 Java Collections Framework 종류 💯 총정리

Java Collection Framework 자바 새내기분들은 컬렉션 프레임워크라는 단어에 뭔가 거창하고 어려운 느낌이 들수 있겠지만, 그냥 자료 구조(Data Structure) 종류의 형태들을 자바 클래스로 구현한 모음집

inpa.tistory.com

 

https://codechacha.com/ko/java-how-to-update-value-of-key-from-hashmap/#5-getordefault

 

Java - HashMap에서 key로 value 업데이트

HashMap에서 key로 value를 업데이트하는 방법을 소개합니다. put(key, value)으로 이전에 등록된 key에 대한 value를 업데이트할 수 있습니다. containsKey(key)와 삼항연산자를 이용하여 key가 존재하는 경우만

codechacha.com

 

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

 

[Java] 자바 TreeMap 사용법 & 예제 총정리

TreeMap이란? TreeMap은 이진트리를 기반으로 한 Map 컬렉션입니다. 같은 Tree구조로 이루어진 TreeSet과의 차이점은 TreeSet은 그냥 값만 저장한다면 TreeMap은 키와 값이 저장된 Map, Etnry를 저장한다는 점입

coding-factory.tistory.com

 

'Java' 카테고리의 다른 글

Java의 static 키워드  (0) 2024.05.17
상속과 합성  (0) 2024.05.13
Set  (0) 2024.05.11
LIFO 구조와 ArrayDeque  (0) 2024.05.11
Queue  (0) 2024.05.10