Java Map인 HashMap, TreeMap, LinkedHashMap 에 대해서 정리해 보자.
안드로이드 프로그래밍을 하면서 Map을 사용하게 되는 경우가 종종 있는데요.
Java 에서 제공해주는 Map에는 HashMap, TreeMap, LinkedHashMap 이 있는데요.
이들에 대해서 한번 정리해보겠습니다.
1. HashMap
HashMap의 소스코드는 길어서 다 볼수는 없지만, 간단한 주석이 들어있는 앞부분을 참조해보겠습니다.
눈이 띄는 부분들을 정리해보면 다음과 같네요.
- 인자로, null값이 허용되는 key,value값을 <K,V>로 허용한다.
- 해쉬맵의 순서는 정해져있지 않으므로, 정해진 순서대로 iterate을 하고 싶다면, LinkedHashMap을 사용할 것
- 여러 워커 쓰레드를 사용하는 경우, 자동으로 동기화되지 않으므로, synchronized를 해야할 필요가 있다.
- Serializable을 사용하므로, Intent로 넘기기에도 유용하다.
아무래도 가장 큰 특징은 순서대로 iterate이 않되므로, 입력한 대로 출력이 않된다는 부분인데요.
어떤 Map을 사용할지 고민할 때, 고려해야 중요한 요소라고 할 수 있습니다.
2. TreeMap
3. LinkedHashMap
이제, 마지막 LinkedHashMap에 대해서 알아보겠습니다.
아래에서 소스의 주석설명을 보겠습니다.
눈에 띄는 점들은 다음과 같은데요.
- doulbly-linked list로 저장됨(linked-list 자료구조로 저장된다는 거군요.)
- linked-list므로 당연하게도, 넣은 순서대로 빠져나옵니다.
- HashMap과 마찬가지로 다중쓰레드 사용시에 synchronized가 되지 않습니다.
가장 중요한 것은 linked-list구조를 사용한 것과, 들어가 순서대로, iterate이 되서, 출력이 된다는 점입니다.
4. 정리
HashMap, TreeMap, LinkedHashMap 셋 다, Map interface를 implement하고 있으므로, 대부분 같은 기능을 제공하는데요.
가장 큰 차이점으로는 iteration해서 출력하는 순서라고 할 수 있습니다.
HashMap이 순서가 보장되지 않는다면, TreeMap은 유저가 정한 순서나, Key값의 Natural Order를 따르구요,
LinkedHashMap은 put이 된 순서되로 iteration되고 출력한다고 할 수 있습니다.
HashMap과 LinkedHashMap이 O(1) 의 검색성능을, TreeMap이 O(log(n)) 의 검색성능을 가지므로,
sorting을 특정 조건으로 할 이유가 없다면, HashMap이나 LinekdHashMap을 사용하는 것이 좋을 것 같습니다.