[JAVA] HashMap이란? 메소드 종류 정리

세하·2025년 2월 9일

JAVA

목록 보기
2/17

HashMap

HashMap은 key와 value로 구성된 Map 데이터를 해싱함수를 통해 산출된 인덱스 위치의 버킷(배열)안에 저장하는 자료구조.
해싱함수(function)는 key 값(X)을 받아 인덱스(Y)를 산출함.
key값을 알면 바로 value의 값을 도출해낼 수 있어 시간 복잡도가 O(1)으로 빠른 성능을 갖고 있음.

✔ HashMap은 순서를 보장하지 않음
✔ 정렬이 필요하다면 별도의 조치가 필요함

   참조 : https://velog.io/@seha01130/JAVA-HashMap-정렬하기

Iterator(EntrySet, KeySet, Values의 iterator)

HashMap은 버킷에 Map 데이터를 index 순서대로 저장하지 않음. 따라서 for문이나 while 문으로 탐색하지 못하므로 탐색에 필요한 모듈인 iterator()를 사용하여 탐색한다.
KeySet, Values, EntrySet (데이터 반환 참고) 모두 iterator 사용 가능.

Iterator의 시간복잡도
요소의 개수를 n이라 하면, 모든 요소를 한 번씩 방문하는 데 O(n)
iterator.next() 한 번 호출할 때 평균 O(1), 최악 O(n)
그러나 보통 HashMap은 해시 충돌이 적게 발생하도록 설계되므로, Iterator의 성능은 평균적으로 O(n) 순회와 O(1) 탐색이 보장됨.

예제 코드

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

public class tmp {

    public static void main(String[] args) {
        HashMap<String, String> hshMap = new HashMap<>();
        hshMap.put("헬로키티", "고양이");
        hshMap.put("케로로", "개구리");
        hshMap.put("마이멜로디", "토끼");
        hshMap.put("한교동", "물고기");
        hshMap.put("포챠코", "강아지");

        //Set<Map.Entry<String, String>> entrySet = hshMap.entrySet();
        //Iterator<Map.Entry<String, String>> itr = entrySet.iterator();
        //위의 두 작업을 아래처럼 한 번에 쓸 수 있다.
        
        Iterator<Map.Entry<String, String>> itr = hshMap.entrySet().iterator();

        System.out.println();
        System.out.println("[출력]");
        while (itr.hasNext()) {
            Map.Entry<String, String> eachEntry = itr.next();
            System.out.printf("[%s] %s\n", eachEntry.getValue(), eachEntry.getKey());
        }

        System.out.println();
        System.out.println("[동물]");
        Collection<String> values = hshMap.values();
        Iterator<String> iterator = values.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

        System.out.println();
        System.out.println("[캐릭터 종류]");
        Set<String> keys = hshMap.keySet();
        iterator = keys.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

그러나 만약 한 번 iterator를 사용하여 탐색을 끝마쳤다면 다시 해당 반복자 객체를 사용하여 탐색할 수 없다. 즉, iterator를 재사용하려면 새로 반복자 객체 하나를 다시 생성하여 사용하여야 함.

  • Iterator는 기본적으로 단방향 순회(Forward-Only Traversal)를 지원하므로 한 번 지나간 요소로 되돌아갈 방법이 없다.
  • HashMap에서 새로운 반복을 시작하려면 새로운 Iterator를 생성해야 함.
    iterator() 메서드를 다시 호출하면 새로운 Iterator 객체가 생성되고, 이를 통해 처음부터 다시 순회 가능.
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class HashMapIteratorExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new HashMap<>();
        map.put("A", 1);
        map.put("B", 2);
        map.put("C", 3);

        Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();

        // 첫 번째 순회
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

        // 재사용 시도 (불가능)
        System.out.println("다시 순회 시도...");
        while (iterator.hasNext()) {
            System.out.println(iterator.next()); // 출력 없음 (이미 끝까지 탐색됨)
        }

        // 새로 Iterator를 생성하면 가능
        iterator = map.entrySet().iterator();
        System.out.println("새로운 Iterator 생성 후 순회...");
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
    }
}

메소드 종류

데이터 추가

  1. V put(K key, V value) : key와 value를 저장
  2. void putAll(Map<? extends K, ? extends V> m) : Map m에 저장된 모든 Element를 HashMap에 저장
		HashMap<String, Integer> map1 = new HashMap<>();
        map1.put("apple", 100);
        map1.put("banana", 150);

        HashMap<String, Integer> map2 = new HashMap<>();
        map2.put("orange", 200);
        map2.put("banana", 180); // 기존 키 'banana'가 덮어짐

        map1.putAll(map2);

        System.out.println("map1 after putAll: " + map1); 
        // {apple=100, banana=180, orange=200}
  1. V putIfAbsent(K key, V value) : 기존 데이터에 key가 없으면 key와 value를 저장
		HashMap<String, Integer> map = new HashMap<>();
        map.put("apple", 100);

        map.putIfAbsent("banana", 150); // banana가 없으므로 저장됨
        map.putIfAbsent("apple", 200);  // apple이 있으므로 무시됨

        System.out.println("map: " + map); 
        // {apple=100, banana=150}

데이터 삭제

  1. void clear( ) : 모든 데이터를 삭제
  2. V remove(Object key) : key와 일치하는 기존 데이터( key와 value)를 HashMap에서 삭제
  3. boolean remove(Object key, Object value) : key와 value가 동시에 일치하는 데이터를 HashMap에서 삭제

데이터 수정

  1. V replace(K key, V value) : key와 일치하는 기존 데이터의 value를 변경
  2. V replace(K key, V oldValue, V newValue) : key와 oldValue가 동시에 일치하는 데이터의 value를 newValue로 변경

데이터 확인

  1. boolean containsKey(Object key) : key와 일치하는 데이터가 있는지 여부를 반환 (있으면 true)
  2. boolean containsValue(Object value) : value가 일치하는 데이터가 있는지 여부를 반환 (있으면 true)
  3. boolean isEmpty( ) : 데이터가 빈 상태인지 여부를 반환 (빈 상태면 true)
  4. int size( ) : key-value 맵핑 데이터의 개수를 반환

데이터 반환

  1. V get(Object key) : key와 맵핑된 value값을 반환 (Key에 해당하는 Value가 없는 경우 null을 반환)
  2. 🌟 V getOrDefault(Object key, V defaultValue) : key와 맵핑된 value값을 반환 (없으면 defaultValue값을 반환)
hm.put(word, hm.getOrDefault(word, 0) + 1);
  1. Set<Map.Entry<K, V>> entrySet( ) : HashMap에 저장된 Key와 Value를 Entry의 형태로 Set에 저장해 반환
  2. Set keySet( ) : 모든 key 값을 가진 Set 데이터를 반환 
  3. Collection values( ) : 모든 value 값을 가진 Collection 데이터를 반환

데이터 클론

  1. Object clone() : [Swallow Copy]

0개의 댓글