Android 개발/Java, Java8

Java Map인 HashMap, TreeMap, LinkedHashMap 에 대해서 정리해 보자.

Developer88 2017. 2. 12. 00:01
반응형

안드로이드 프로그래밍을 하면서 Map을 사용하게 되는 경우가 종종 있는데요.

Java 에서 제공해주는 Map에는  HashMap, TreeMap, LinkedHashMap 이 있는데요.

이들에 대해서 한번 정리해보겠습니다.


1. HashMap


HashMap의 소스코드는 길어서 다 볼수는 없지만, 간단한 주석이 들어있는 앞부분을 참조해보겠습니다.

눈이 띄는 부분들을 정리해보면 다음과 같네요.

  • 인자로, null값이 허용되는 key,value값을 <K,V>로 허용한다.
  • 해쉬맵의 순서는 정해져있지 않으므로, 정해진 순서대로 iterate을 하고 싶다면, LinkedHashMap을 사용할 것
  • 여러 워커 쓰레드를 사용하는 경우, 자동으로 동기화되지 않으므로, synchronized를 해야할 필요가 있다.
  • Serializable을 사용하므로, Intent로 넘기기에도 유용하다.

아무래도 가장 큰 특징은 순서대로 iterate이 않되므로, 입력한 대로 출력이 않된다는 부분인데요.

어떤 Map을 사용할지 고민할 때, 고려해야 중요한 요소라고 할 수 있습니다.




2. TreeMap


TreeMap도 소스를 열어서 주석을 보면서 눈에 띄는 부분들을 정리해보겠습니다.

길고 긴 설명중에서, 가장 눈에 띄고 중요한 부분은,
유저가 제공해주는 comparators 나 키의 natural order에 의해서 sort가 된다.
는 부분인 것 같습니다.

참고로 내부적인 알고리즘이 RedBlack Tree를 이용한다고 하는군요.



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을 사용하는 것이 좋을 것 같습니다.



728x90