FireDrago

LinkedHashMap 구조 본문

자료구조

LinkedHashMap 구조

화이용 2024. 7. 21. 11:06

LinkedHashMap 구조

// HttpHeader 객체
HttpHeaders headers = new HttpHeaders();

// HttpBody 객체
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();

// Http body param 과 Http header 를 가진 엔티티
HttpEntity<MultiValueMap<String,String>> naverTokenRequest = new HttpEntity<>(params, headers);

네이버 API 연동을 위한 HTTP 요청을 생성하던중 LinkedMultivalueMap 객체를 사용하게 되었다.

LinkedMultivalueMap 은 내부적으로 LinkedHashMap 을 사용하고, 하나의 키에 여러 값을 저장할수 있는 객체이다.

LinkedHashMap 은 어떤 구조로 자료를 저장하는지 궁금해서 정리했다.

 

LinkedHashMap 은 key, value 외에도 next, after, before 값을 가진다.

after , before 값은 엔티티 간의 순서를 보장하기위해 이전의 노드 주소와 다음 노드 주소를 가르킨다.

이를통해 순서를 보장할 수 있게된다. LinkedList 같은 원리인 것이다.

참고로 자바는 Linked~ 자료구조는 모두 이전노드와 다음노드 주소를 동시에 가지는 양방향으로 구현한다.

 

흥미로운건 next 값이다. 해시값을 사용할때는 '해시 충돌' 문제가 발생할 수 있다.

해시충돌은 서로 다른 엔티티가 동일한 해시값을 가지는 현상을 말한다.

next 값은 해시충돌을 해결하기 위해 존재한다.

 

LinkedHashMap 은 동일한 해시값을 가지는 엔티티를 버킷테이블(ArrayList) 의 동일한 배열값에 배치한다.

그 이후 체이닝을 통해 엔티티를 배치한다. next 값은 체이닝을 통해 연결된 다음 엔티티를 가르킨다.

해시충돌로 인한 문제를 방지한다.

- before : 이 노드 앞에 삽입된 노드를 가리킴
- after : 이 노드 뒤에 삽입된 노드를 가리킴
- key : 제공된 키
- value : 제공된 값
- next : 배열 테이블의 동일한 버킷에 있는 다음 노드를 가리킴

 

<LinkedHashMap>

- HashMap의 빠른 검색속도 O(1) + 순서보장

- 순서보장을 위해 더 많은 메모리가 필요하다.

- HashMap과 동일하게 동기화처리가 되어있지않다. 멀티쓰레드 환경에 적합하지 않다.

 

 

 

'자료구조' 카테고리의 다른 글

[java] HashMap 과 TreeMap  (0) 2023.05.29
[java] HashSet 과 TreeSet  (0) 2023.05.25
[java] ArrayList vs Linked List  (0) 2023.05.20