🔥 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}
}
}
✅ 실행 결과
✔ 입력 순서 그대로 저장됨!
✔ 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 옵션을 사용하면 최근에 접근한 순서대로 정렬됨!
✅ 실행 결과
✔ 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 |
댓글