Map은 키와 값이 한 쌍으로 이루어지는 데이터의 집합
값은 중복을 허용하나 키는 중복될 수 없음(키는 중복될 경우 덮어 씀)
Map Interface 를 구현한 HashMap, HashTable, LinkedHashMap, TreeMap 은 모두 위 규칙을 따름.
[HashMap]
순서가 보장되지 않는다.
Null을 허용한다.
Thread Safe 하지 않다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//순서를 보장하지 않음
//key, value 에 Null 허용
//Thread safe X
Map<Integer, Integer> map = new HashMap<>();
map.put(1, 180);
map.put(3, 175);
map.put(2, 160);
map.put(4, 190);
map.put(3, 170);
try {
map.put(0, null);
} catch(NullPointerException ne) {
System.out.println(ne.getMessage());
}
for(int s : map.keySet()) {
System.out.println("person : " + s + ", height : " + map.get(s));
}
|
cs |
[실행결과]
person : 0, height : null
person : 4, height : 190
person : 3, height : 170
person : 2, height : 160
person : 1, height : 180
1, 3, 2, 4, 3, 0 의 Key 를 순서대로 입력하였지만 순서는 지켜지지 않았다.
(혹여 정렬된 것 처럼 값이 출력된다 해도 정렬이 되어 나온게 아니다)
14번 라인에 null 값을 넣어봤지만 exception 이 찍히지 않았다 : null 허용
[HashTable]
순서가 보장되지 않는다
Null을 허용하지 않는다
Thread Safe 하다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//순서를 보장하지 않음
//key, value 에 Null 허용
//Thread safe
Map<Integer, Integer> map = new Hashtable<>();
map.put(1, 180);
map.put(3, 175);
map.put(2, 160);
map.put(4, 190);
map.put(3, 170);
try {
map.put(0, null);
} catch(NullPointerException ne) {
System.out.println(ne.getMessage());
}
for(int s : map.keySet()) {
System.out.println("person : " + s + ", height : " + map.get(s));
}
|
cs |
[실행결과]
null
person : 4, height : 190
person : 3, height : 170
person : 2, height : 160
person : 1, height : 180
HashMap 과 마찬가지로 순서가 보장되지 않았다.
14번라인에서 NullPointerException 이 발생하여 null 이라는 에러메시지를 찍고 있다.
[LinkedHashMap]
입력한 순서가 보장된다
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//입력한 순서가 보장됨
//Thread safe X
Map<Integer, Integer> map = new LinkedHashMap<>();
map.put(1, 180);
map.put(3, 175);
map.put(2, 160);
map.put(4, 190);
map.put(3, 170);
for(int s : map.keySet()) {
System.out.println("person : " + s + ", height : " + map.get(s));
}
|
cs |
[실행결과]
person : 1, height : 180
person : 3, height : 170
person : 2, height : 160
person : 4, height : 190
put 을 한 순서(1, 3, 2, 4)대로 결과가 출력되었다.
[TreeMap]
데이터가 내부적으로 정렬되어 존재한다. (RedBlackTree 구조)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
//KEY를 기준으로 정렬함(내부적으로 RedBlackTree 구조로 정렬)
//Thread safe X
Map<Integer, Integer> map = new TreeMap<>();
map.put(1, 180);
map.put(3, 175);
map.put(2, 160);
map.put(4, 190);
map.put(3, 170);
for(int s : map.keySet()) {
System.out.println("person : " + s + ", height : " + map.get(s));
}
|
cs |
[실행 결과]
person : 1, height : 180
person : 2, height : 160
person : 3, height : 170
person : 4, height : 190
오름차순 기준으로 key값을 정렬하여 출력되었다.
※ 정렬 순서를 바꾸고 싶다면?
Comparator 를 인자값으로 넘겨준다. Comparator 에 대한 설명은 이곳을 참고
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
Map<Integer, Integer> map2 = new TreeMap<>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
map2.put(1, 180);
map2.put(3, 175);
map2.put(2, 160);
map2.put(4, 190);
map2.put(3, 170);
for(int s : map2.keySet()) {
System.out.println("person : " + s + ", height : " + map2.get(s));
}
|
cs |
[실행결과]
person : 4, height : 190
person : 3, height : 170
person : 2, height : 160
person : 1, height : 180
내림차순 기준으로 key값을 정렬하여 출력되었다.
반응형
'Computer Science > data structure' 카테고리의 다른 글
[Data Structure] Queue 큐, array로 구현하기 (java) (0) | 2020.01.05 |
---|---|
[Data Structure] Stack 스택, array 로 구현하기 (java) (0) | 2020.01.05 |
[Data Structure] HashSet, LinkedHashSet, TreeSet (0) | 2019.12.22 |
[Data Structure] ArrayList, LinkedList, Vector (0) | 2019.12.20 |
트리 순회 (0) | 2019.11.26 |