이전에 포스팅에서 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
'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 |
댓글