본문 바로가기
내생각들/개념정리

LinkedHashMap<K, V> 개념정리 - HashMap vs LinkedHashMap vs TreeMap

by 코딩마스터^^ 2025. 2. 16.

🔥 LinkedHashMap 완벽 정리! 🔥

💡 LinkedHashMap이란?

  • LinkedHashMap<K, V>은 HashMap의 기능 + 추가적으로 "순서 유지" 기능이 있는 맵
  • HashMap과 거의 동일하지만, 입력한 순서를 유지한다는 점이 가장 큰 차이점
  • 내부적으로 이중 연결 리스트(Doubly Linked List) 를 사용하여 순서를 관리

📌 1. HashMap vs LinkedHashMap 비교

       특징                                           HashMap                            LinkedHashMap

데이터 순서 유지 ❌ 순서 유지 안 함 ✅ 입력 순서 유지
검색 속도 O(1) O(1)
삽입 속도 O(1) O(1) (연결 리스트 때문에 약간 더 느릴 수도 있음)
삭제 속도 O(1) O(1)
메모리 사용량 적음 조금 더 많음 (이중 연결 리스트 추가)

 


📌 2. LinkedHashMap 기본 사용법

🚀 put()을 사용한 삽입 순서 유지

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

public class LinkedHashMapExample {
    public static void main(String[] args) {
        Map<String, Integer> map = new LinkedHashMap<>();

        map.put("Alice", 25);
        map.put("Bob", 30);
        map.put("Charlie", 35);

        System.out.println(map); // {Alice=25, Bob=30, Charlie=35}
    }
}
 

✅ 실행 결과

 
{Alice=25, Bob=30, Charlie=35}
 

입력 순서 그대로 저장됨!
✔ HashMap은 순서를 보장하지 않지만, LinkedHashMap은 순서 유지.


🚀 get()을 사용한 값 조회

 
System.out.println(map.get("Bob")); // 30

✔ HashMap처럼 O(1) 속도로 값 조회 가능.


🚀 remove()을 사용한 값 삭제

map.remove("Alice"); System.out.println(map); // {Bob=30, Charlie=35}

✔ 키 "Alice"를 삭제해도, 남아있는 요소의 순서는 유지됨!


📌 3. LinkedHashMap의 순서 유지 방식

입력 순서 유지
접근 순서 유지 가능 (LRU 캐시 기능 지원!)


🚀 accessOrder = true 로 최근 사용된 순서대로 정렬 (LRU 캐시)

  • LinkedHashMap은 기본적으로 입력 순서를 유지하지만,
  • accessOrder = true 옵션을 사용하면 최근에 접근한 순서대로 정렬됨!
java
CopyEdit
import java.util.LinkedHashMap; import java.util.Map; public class LRUCacheExample { public static void main(String[] args) { // 최근 사용된 항목을 가장 마지막으로 이동 (accessOrder = true) Map<String, Integer> map = new LinkedHashMap<>(16, 0.75f, true); map.put("A", 1); map.put("B", 2); map.put("C", 3); map.put("D", 4); // "B"에 접근 System.out.println("B의 값: " + map.get("B")); System.out.println(map); // {A=1, C=3, D=4, B=2} (B가 마지막으로 이동됨) } }

✅ 실행 결과

mathematica
CopyEdit
B의 값: 2 {A=1, C=3, D=4, B=2}

✔ get("B")를 호출했더니, "B"가 가장 마지막으로 이동!
LRU(Least Recently Used) 캐시 구현 가능.


📌 4. LinkedHashMap의 주요 메서드

메서드설명

put(K, V) 키-값 추가 (순서 유지)
get(K) 값 조회
remove(K) 값 삭제
containsKey(K) 특정 키 존재 여부 확인
containsValue(V) 특정 값 존재 여부 확인
size() 요소 개수 반환
clear() 모든 데이터 삭제

📌 5. LinkedHashMap을 사용해야 할 때

입력 순서를 유지해야 할 때
순서대로 데이터 처리할 때 (ex. 캐시, 로그 기록 등)
최근 사용된 데이터를 관리할 때 (LRU 캐시)


📌 6. LinkedHashMap을 활용한 예제

🔥 최근 검색 기록 저장 (LRU 캐시)

💡 LinkedHashMap을 상속받아 removeEldestEntry() 메서드를 재정의(오버라이드)하면, 캐시 크기를 초과했을 때 자동으로 가장 오래된 데이터를 삭제할 수 있다.

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

public class LRUCache<K, V> extends LinkedHashMap<K, V> {
    private final int CACHE_SIZE; // 최대 캐시 크기

    public LRUCache(int size) {
        super(size, 0.75f, true); // accessOrder = true (최근 사용 순서 유지)
        //    크기,  디폴트값, 최근사용순서 자동정렬
        this.CACHE_SIZE = size;
    }

    @Override
    protected boolean removeEldestEntry(Map.Entry<K, V> eldest) {
        return size() > CACHE_SIZE; // 캐시 크기를 초과하면 가장 오래된 항목 삭제
    }

    public static void main(String[] args) {
        LRUCache<String, String> cache = new LRUCache<>(3);

        cache.put("Google", "www.google.com");
        cache.put("Facebook", "www.facebook.com");
        cache.put("Twitter", "www.twitter.com");

        System.out.println("초기 캐시: " + cache);

        // "Google"을 사용 (가장 최근 사용된 것으로 업데이트됨)
        cache.get("Google");
        System.out.println("Google 사용 후: " + cache);

        // 새로운 데이터 추가 (최대 크기 초과 → 가장 오래된 항목 삭제)
        cache.put("YouTube", "www.youtube.com");
        System.out.println("YouTube 추가 후: " + cache);
    }
}
 

✔ removeEldestEntry()를 오버라이드하여 캐시 크기를 초과하면 가장 오래된 항목 삭제
LRU(Least Recently Used) 캐시 구현 가능! 

 

 

 

  • size: 초기 용량 (크기는 중요하지 않음, 중요한 건 removeEldestEntry())
  • 0.75f: 로드 팩터 (기본값)
  • true: accessOrder = true 설정 → 최근 사용된 순서로 자동 정렬

 


📌 7. 결론: LinkedHashMap이 언제 유용할까?

상황                                                                                                                       HashMap                       LinkedHashMap

순서가 필요 없음 ✅ 적합 ❌ 불필요
순서를 유지해야 함 ❌ 불가능 ✅ 적합
최근 사용된 데이터 관리 (LRU 캐시) ❌ 불가능 ✅ 가능
데이터 검색 속도 O(1) O(1)

데이터 검색이 빠르면서도 순서 유지가 필요하면 LinkedHashMap을 사용해야 함! 🚀
일반적인 경우 HashMap, 순서가 필요할 땐 LinkedHashMap을 선택!

 

 

🔥 HashMap vs LinkedHashMap – 어떤 걸 써야 할까? 🔥

💡 결론부터 말하면:
👉 항상 LinkedHashMap을 쓰는 건 ❌ 비효율적!
👉 정렬이 필요하면 LinkedHashMap ✅, 정렬이 필요 없으면 HashMap ✅
👉 무조건 더 좋은 자료구조는 없음, 상황에 맞게 선택해야 함!


📌 1. HashMap vs LinkedHashMap 비교

특징.                                               HashMap                                 LinkedHashMap

순서 유지 ❌ 없음 ✅ 유지됨
검색 속도 ⚡ O(1) (빠름) ⚡ O(1) (거의 같음)
삽입 속도 ⚡ O(1) (빠름) 🔻 O(1) (조금 느림)
삭제 속도 ⚡ O(1) (빠름) 🔻 O(1) (조금 느림)
메모리 사용 ✅ 적음 🔻 많음 (이중 연결 리스트 추가됨)
LRU 캐시 기능 ❌ 없음 ✅ accessOrder=true로 가능
정렬 기능 ❌ 없음 ✅ 입력 순서 유지
멀티스레드 지원 ❌ 아님 ❌ 아님

💡 즉, LinkedHashMap은 메모리를 더 쓰면서도 순서를 유지하는 대가를 치름!
💡 정렬이 필요 없으면 HashMap이 더 빠르고 가벼움!


📌 2. 언제 HashMap을 사용해야 할까?

데이터 순서가 필요 없는 경우
빠른 검색(O(1))이 필요한 경우
메모리 사용량을 줄이고 싶은 경우
단순한 Key-Value 저장이 필요한 경우

👉 ✅ HashMap 추천!

 

📌 3. 언제 LinkedHashMap을 사용해야 할까?

입력된 순서를 유지해야 하는 경우
최근 사용된 순서로 정렬하고 싶은 경우 (LRU 캐시)
반복할 때 일정한 순서로 출력하고 싶은 경우
정렬이 필요하지만 TreeMap은 부담스러운 경우

👉 ✅ LinkedHashMap 추천!

 

4. TreeMap과 비교

💡 정렬이 필요하면 TreeMap이 더 적합할 수도 있음!
✔ TreeMap은 키를 자동 정렬 (O(log n))
✔ LinkedHashMap은 입력된 순서 (O(1))

👉 TreeMap 예제 (자동 정렬)

 

📌 5. 정리: HashMap vs LinkedHashMap vs TreeMap

     특징                                     HashMap                                LinkedHashMap                           TreeMap

순서 유지 ❌ 없음 ✅ 입력 순서 유지 ✅ 키 기준 정렬
검색 속도 ⚡ O(1) (빠름) ⚡ O(1) (빠름) 🔻 O(log n) (느림)
삽입 속도 ⚡ O(1) 🔻 O(1) (약간 느림) 🔻 O(log n)
삭제 속도 ⚡ O(1) 🔻 O(1) (약간 느림) 🔻 O(log n)
메모리 사용량 ✅ 적음 🔻 많음 🔻 많음
자동 정렬 ❌ 없음 ❌ 없음 ✅ 키 정렬
LRU 캐시 가능 ❌ 없음 ✅ 가능 ❌ 없음

'내생각들 > 개념정리' 카테고리의 다른 글

HashMap<K, V> 정리 - 사용법, 연산속도  (0) 2025.02.16
코드 컨벤션 참고  (0) 2024.08.08
리액트 vite  (0) 2024.03.27
북마크  (1) 2024.03.20
DevOps 교육 정리  (0) 2024.03.15

댓글