Key, Value 형식으로 데이터를 저장하는 자료형이다.
Map 인터페이스는 기본적으로 Key값의 Hashcode를 이용하여 데이터의 존재 여부 혹은 삽입 삭제 등의 연산의 위치(=bucket)를 판단하며, 동일한 Hashcode를 갖는다면 Key의 eqauls 메소드를 통하여 연산을 진행한다.
HashMap은 다음과 같이 Node단위로 데이터를 저장한다. 해당 노드는 hashcode, key, value, next 변수를 가지고 있다.
HashMap의 연산들은 삽입할때는 다음과 같이 put 과정 및 조건에 따라 resize하는 과정이 추가된다.
추가로, 내부의 Node배열을 유지해 해당 값에 인덱스 & Hashcode연산을 통해 직접접근 하므로, O(1)시간 내에 해당 객체를 조회할 수 있다.
HashMap은 삽입, 삭제, 조회 등의 연산 시 Hashcode연산을 통해 해당 값에 접근하고, 연산을 한다. 이때, Key를 통해 데이터를 접근하는데, 해당 Key의 == 연산을 통해 우선적으로 접근하고, == 연산이 실패하면, equals 연산의 결과를 통해 데이터에 접근한다.
HashMap은 null 키 값을 허용한다. null은 Hashcode를 제공할 수 없으므로, HashMap의 키 값으로 null이 들어오면 0번 인덱스의 버킷에 삽입한다.
TreeMap은 Balanced Binaray Tree인 Red-Black Tree를 이용하여, 데이터를 저장할 때, 키 값을 기준으로 정렬하여 저장한다. 이 때, Comparable 인터페이스를 구현하여 전달해, 정렬 순서를 커스텀할 수 있다.
TreeMap은 데이터에 접근할 때, 트리를 순회하며 접근하므로 O(log N)의 시간 복잡도를 갖는다.
TreeMap은 Comparable 인터페이스에서 null 키 여부를 적절히 처리 할 수 있다면, null 키 값을 저장할 수 있다.
LinkedHashMap은 삽입된 순서를 유지하여 저장되며 HashMap과의 다른 점으로는 노드가 순서상 이전의 객체와 다음의 객체에 대한 참조를 추가적으로 저장하여 HashMap보다 추가의 메모리를 사용한다.
LinkedHashMap도 HashMap과 같이 내부의 Node배열을 유지해 O(1)시간 내에 해당 객체를 조회할 수 있다.
LinkedHashMap은 HashMap과 마찬가지로 null 키 값을 가질 수 있습니다.
참고.
https://stackoverflow.com/questions/24522051/why-is-equals-method-not-called-in-the-hashmap
https://ko.wikipedia.org/wiki/%EB%A0%88%EB%93%9C-%EB%B8%94%EB%9E%99_%ED%8A%B8%EB%A6%AC#%EC%B2%AB_%EB%B2%88%EC%A7%B8_%EA%B2%BD%EC%9A%B0
https://stackoverflow.com/questions/25932730/hashmap-with-null-key-and-null-value