LinkedHashMap — 삽입 순서를 유지하는 해시 맵

LinkedHashMap — 삽입 순서를 유지하는 해시 맵

LinkedHashMap<K, V>잘 정의된 만남 순서(encounter order)를 가진 Map 인터페이스의 해시 테이블 + 연결 리스트 구현이에요. HashMap과 달리 모든 항목을 통과하는 이중 연결 리스트를 유지해요. 이 연결 리스트가 만남 순서(순회 순서)를 정의하는데, 보통 키가 맵에 삽입된 순서(삽입 순서)예요.

출처: Java API Reference

본문

public class LinkedHashMap<K, V> extends HashMap<K, V>
    implements SequencedMap<K, V>

가장 오래된(최근에 삽입되지 않은) 항목이 먼저, 가장 최근 항목이 마지막이에요. put으로 키를 다시 삽입해도 만남 순서는 바뀌지 않아요. putFirst/putLast로 이미 있는 항목의 만남 순서를 바꿀 수 있어요.

이 구현은 HashMap(과 Hashtable)의 불명확하고 대체로 혼란스러운 순서를 피하면서도 TreeMap에 비해 추가 비용이 없어요. 원본 맵의 구현과 무관하게 같은 순서의 복사본을 만들 수 있어요. 예를 들어 모듈이 입력 맵을 받아 복사한 뒤 그 복사본의 순서대로 결과를 반환하는 경우에 특히 유용해요.

특수 생성자로 접근 순서(access-order) 맵을 만들 수 있는데, 가장 최근에 접근하지 않은 항목부터 최근 접근 순으로 순회돼요. 이런 맵은 LRU 캐시를 만드는 데 잘 맞아요. put, get, compute 등의 메서드가 호출될 때마다 접근 순서가 갱신돼요.

생성자

  • LinkedHashMap(int initialCapacity, float loadFactor) — 빈 삽입 순서 맵을 지정된 초기 용량/로드 팩터로 만들어요.
  • LinkedHashMap(int initialCapacity) — 기본 로드 팩터(0.75)로 만들어요.
  • LinkedHashMap() — 기본 초기 용량(16)과 로드 팩터(0.75)로 만들어요.
  • LinkedHashMap(Map m) — 지정된 맵과 같은 매핑으로 만들어요.
  • LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) — 지정된 순서 모드(삽입/접근 순서)로 만들어요.

순서 관련 메서드

  • putFirst(K k, V v) / putLast(K k, V v) — 매핑을 만남 순서의 첫/마지막에 넣어요.
  • reversed() — 반대 순서의 SequencedMap 뷰를 반환해요.
  • sequencedKeySet() / sequencedValues() / sequencedEntrySet() — 순서 보존형 뷰를 반환해요.

표준 메서드

containsValue, get, clear, keySet(), values(), entrySet()HashMap과 동일하게 동작하지만, 만남 순서가 맵의 항목 순서를 따르는 뷰를 반환해요. newLinkedHashMap(int numMappings)은 기대 매핑 수에 알맞은 빈 맵을 만들어요.

removeEldestEntry

protected boolean removeEldestEntry(Map.Entry<K, V> eldest)

맵이 가장 오래된 항목을 제거해야 하면 true를 반환해요. put/putAll이 새 항목을 삽입한 뒤 호출돼요. 캐시를 구현할 때 유용해요. 예를 들어 size() > MAX_ENTRIES일 때 true를 반환하면 100개 항목의 정상 상태를 유지하는 캐시를 만들 수 있어요. 기본 구현은 false를 반환해요. 이 메서드가 맵을 직접 수정한다면 false를 반환해야 해요.

더 알아보기 (Learn more)