☝️ HashMap해시 함수를 사용 → O(1) 시간 복잡도✌️ TreeMapRB-Tree 관리 → O(log N) 시간 복잡도🤟 LinkedHashMapHashMap 클래스 확장한 클래스 → O(1) 시간 복잡도✨ 요약
☝️ HashMap해시 함수를 사용 → O(1) 시간 복잡도✌️ TreeMapRB-Tree 관리 → O(log N) 시간 복잡도🤟 LinkedHashMapHashMap 클래스 확장한 클래스 → O(1) 시간 복잡도✨ 요약
☝️ HashMap
- 내부적으로 Entry 배열을 만들어 관리
- 객체의 hashCode() 메서드의 리턴값을 기반으로 동작
- 충돌 대비 equals() 메서드까지 사용하여 Key 값이 같은 경우에만 Value 리턴 (사용할 클래스 특성에 따라 필요한 경우 hasCode(), equals() 메서드 오버라이딩 필요)
- 데이터 전체를 사용하는 경우 순서가 뒤섞임
Map<String, String> map = new HashMap<>(); map.put("일식", "초밥"); map.put("중식", "짬뽕"); map.put("한식", "김치찌개"); map.forEach((key, value) -> { log.info("key: {}, value: {}", key, value); });
결과를 보면 입력한 순서대로 출력되지 않는 것을 확인할 수 있습니다.
key: 중식, value: 짬뽕 key: 일식, value: 초밥 key: 한식, value: 김치찌개
해시 함수를 사용 → O(1) 시간 복잡도
다른 Map에 비해 빠른 탐색시간을 가진다.
✌️ TreeMap
- 내부적으로 RedBlack Tree로 저장 관리 → Key 값 기준으로 정렬된 상태 유지
- Key 값으로 사용될 클래스에
Comparator 인터페이스
를 구현하면 정렬된 순서 조정 가능
RB-Tree 관리 → O(log N) 시간 복잡도
- 추가 및 삭제 → O(log N) 시간 복잡도
- HashMap과 비교했을 때 조금 더 느림
🤟 LinkedHashMap
- 데이터의 입력된 순서를 기억
- 각 항목은 Map.Entry 클래스를 구현한 Node 클래스 (before, after 멤버를 가지는 연결 리스트 구조)
- HashMap의 모든 기능은 그대로 사용 가능
- 순서 유지를 위해 이중 연결 리스트(Doubly Linked List)를 사용 → 메모리 사용량이 HashMap보다 높다
HashMap 클래스 확장한 클래스 → O(1) 시간 복잡도
- LinkedList의 각 항목을 순회
- 추가 및 삭제도 O(1)
- 모든 멤버 순회도 O(1)
✨ 요약
- HashMap은 순서 보장 X
- TreeMap은 Key 값으로 사용된 클래스의 비교 연산을 활용해서 순서 보장 (Comparator 인터페이스를 구현해서 순서 조정 가능)
- LinkedHashMap은 입력된 순서 보장 (불필요하게 Linked-list 유지 비용이 생길 수 있음)