HashMap

 인자로,null값이 허용되는 key,value값을 <K,V>로 허용한다.

해쉬맵의 순서는 정해져있지 않으므로,정해진 순서대로 iterate을 하고 싶다면,LinkedHashMap을 사용할 것

여러 워커 쓰레드를 사용하는 경우, 자동으로 동기화 되지않으므로, synchronized을 해야할 필요가 있다.

Serialzable을 사용하므로, intent로 넘기기에도 유용하다.

1 Map<String, String> map = Maps.newHashMap();
2 map.put("c", "1");
3 map.put("a", "1");
4 map.put("b", "1");
5 map.put("k", "1");
6 for (String s : map.keySet()) {
7     System.out.println(s);
8 }
9 // b, c, a, k 출력

내부 hash값에 따라서 키순서가 정해지므로 특정 규칙없이 출력됨.

TreeMap

 유저가 제공해주는 comparators 나 키의 natural order에 의해서 sort가된다.

내부 알고리즘서 RedBlack Tree를 사용

Map<String, String> map = Maps.newTreeMap();
2 map.put("c", "1");
3 map.put("a", "1");
4 map.put("b", "1");
5 map.put("k", "1");
6 for (String s : map.keySet()) {
7     System.out.println(s);
8 }
9 // a, b, c, k 출력

키값이 알파벳 순서대로 정렬된다. 트리에 저장되므로 키값은 일정 기준으로 정렬된 상태로 출력

LinkedHashMap

doulbly-linked list 자료구조로 저장됨

linked-list이므로 넣은 순서대로 빠져나온다.

HashMap과 마찬가지로 다중쓰레드 사용시에 synchronized가 되지 않음.

linked-list와 같이 들어간 순서대로 iterate이 되서 출력이 된다.

1 Map<String, String> map = Maps.newLinkedHashMap();
2 map.put("c", "1");
3 map.put("a", "1");
4 map.put("b", "1");
5 map.put("k", "1");
6 for (String s : map.keySet()) {
7     System.out.println(s);
8 }
9 // c, a, b, k 출력

키값을 입력한 순서대로 출력이 되서 나온다.

 

결론

  • 특별한 이유가 없다면 검색 성능이 좋은(O(1)) HashMap 을 사용하자
  • 키값이 일정한 수준대로 iterate 하려고 한다면 TreeMap 을 사용하자. 하지만 랜덤 접근에 대해서는 O(logn) 성능을 지니므로 많은 데이터를 넣을경우 좋지 않은 성능이 나올수 있다.
  • 입력 순서가 의미있다면 LinkedHashMap 을 사용하자. 랜덤 접근에 대해 O(n) 성능을 지니므로 많은 데이터를 입력할 경우 사용하지 않는것이 좋겠다!

 

출처

 

Java Map - HashMap, TreeMap, LinkedHashMap 차이

Java Map 자바에는 여러 Map 이 있다. 생각없이 아무거나 쓰지말고 차이를 알아보자 HashMap 내부적으로 Entry [] Entry 의 array 로 되어 있다. 해당 array 에 index 는 내부 해쉬 함수를 통해 계산된다. String 은 sun.misc.Hashing.stringHash32 함수를 사용하고 일반 Object는 내부 hashcode 함수와 비트연산으로 계산되어진다. 1 Map map = Maps.newHashMap();

rangken.github.io

  

 

 

'Coding > Java' 카테고리의 다른 글

비공개저장용  (0) 2019.12.06
Set ->hashset, treeset, linkedhashset, sortedset  (0) 2019.11.13
List -> ArrayList,LinkedList,Vector  (0) 2019.11.13
JAVA 기본형과 참조형  (0) 2019.11.13
GIT 과 SVN의 차이 + Git의 Rebase와 Merge  (0) 2019.11.13

+ Recent posts