본문 바로가기
IT/Java

LinkedHashMap

by 성준하이 2022. 12. 9.
반응형

 

이전에 포스팅에서 map과 set, list를 다룬적이 있는데 최근

linkedHashMap을 다루다가 해당 주제로 포스팅을 써본다.

 

HashMap 은 hashcode 를 사용하기 때문에 순서가 일정하지 않다.

 

LinkedHashMap 은 내부를 Double-Linked List 로 구성하여 HashMap 의 순서를 유지한다.

 

HashMap 에서 상속받기 때문에 HashMap 의 모든 메소드를 사용할 수 있다.

 

 

순서 유지

데이터는 먼저 들어간 데이터가 무조건 앞에 위치하게 된다.

 

forEach 문에서도 동일하다.

 

Map<String, String> map = new LinkedHashMap<>();

map.put("animal", "cat");
map.put("fruit", "apple");

System.out.println(map);        // {animal=cat, fruit=apple}

map.put("animal", "dog");       
System.out.println(map);        // {animal=dog, fruit=apple}

map.forEach((k, v) -> System.out.print(k + ": " + v + ", "));       // animal: dog, fruit: apple, 

 

 

접근 빈도에 따른 순서 변경

LinkedHashMap 은 생성자 파라미터로 accessOrder 라는 값을 받는다.

 

accessOrder 는 기본값이 false 인데, 만약 true 로 설정한다면 LinkedHashMap 의 접근 빈도에 따라서 순서가 바뀌게 된다.

 

public LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) {
    super(initialCapacity, loadFactor);
    this.accessOrder = accessOrder;
}

 

 

아래 코드는 위와 완전히 동일하지만 accessOrder 만 true 로 생성한 LinkedHashMap 이다.

 

"animal" 키를 먼저 넣었지만 중간에 put 메소드로 "animal" 키에 접근을 했기 때문에 순서가 바뀌었다.

 

put 뿐만 아니라 get 이나 compute 에도 동일하게 동작한다 (containsKey 는 바뀌지 않음)

 

Map<String, String> map = new LinkedHashMap<>(16, 0.75f, true); map.put("animal", "cat"); map.put("fruit", "apple"); System.out.println(map); // {animal=cat, fruit=apple} map.put("animal", "dog"); System.out.println(map); // {fruit=apple, animal=dog} map.forEach((k, v) -> System.out.print(k + ": " + v + ", ")); // fruit: apple, animal: dog,

 

 

accessOrder 를 이용하면 가장 첫번째에 존재하는, 즉 가장 사용되지 않은 Entry 를 알 수 있다.

 

Map.Entry leastUsedEntry = map.entrySet().iterator().next();
int leastUsedKey = map.keySet().iterator().next();
int leastUsedValue = map.values().iterator().next();

// 아래처럼 구할 수도 있다.
leastUsedKey = leastUsedEntry.getKey();
leastUsedValue = leastUsedEntry.getValue();

참고 포스팅

https://thenicesj.tistory.com/282

 

Map, Set, List 에 대해서

이번 포스팅에서는 자바에서 arraylist나 배열 말고 값을 저장할수 있는 또 다른 형태인 map, set, list 에 대해 다뤄보려고 한다. 구조는 다음과 같다. 먼저 각각에 대해 알아보면 list 순서와 중복이

thenicesj.tistory.com

 

반응형

'IT > Java' 카테고리의 다른 글

isNew method  (22) 2022.12.12
Entity 에서 date관련 annotation  (15) 2022.12.11
Flush에 대해  (31) 2022.12.08
JPA query Keyword (repository)  (34) 2022.12.06
JPA메서드 save 와 saveAndFlush 비교  (32) 2022.12.05

댓글