본문 바로가기
IT/Java

자바 Map(HashMap, TreeMap, HashTable, LinkedHashMap)

by flatsun 2019. 2. 7.
반응형

자바의 Map에 대해서 한번 알아보자


Map은 List와 Set과는 다르게 Key와 Value를 동시에 넣는 배열인데

뭔가를 할 때 Key를 사용해서 값을 가져오거나 하게 된다


스크린샷을 통해 알아보자면


일단 Map은 

HashMap<key의 변수 자료형, value의 변수 자료형> map명 = new HashMap<>();

을 통해 정의를 할 수 있는데


HashMap 말고도 TreeMap, HashTable, LinkedHashMap으로도 정의가 가능하지만

이거는 밑에서 알아보고


일단 map을 정의하고 어떻게 사용하는지 알아보자


1
2
3
4
5
6
        HashMap<Integer, String> map = new HashMap<>();
        
        map.put(1"첫번째");
        map.put(2"두번째");
        
        System.out.println(map.get(1));
cs


 map을 정의하고 난 뒤


map명.put(key, value);


으로 map 안에 값을 넣을 수 있는데

키만 넣고 값을 안넣거나

값만 넣고 키를 안넣거나 하는 건 안된다

(null 넣는것은 된다)


map 안에서 값을 가져올 때는 get을 사용하는데


map명.get(key값);


을 통해 값을 출력할 수 있다


여기서는 get으로 키가 1인 것을 가져오게 했는데

이러면 key값이 출력되는 것이 아니라 값인 "첫번째" 가 출력이 된다


1
2
3
4
5
6
7
        map.put(1"첫번째");
        map.put(2"두번째");
        
        map.remove(1);
        
        System.out.println(map.get(1));
        System.out.println(map.size());
cs


다음으로


map명.remove(key값);


을 통해 map 안에서 키에 해당하는 내용을 지울 수 있고


map명.size();


를 통해 map의 크기를 알 수 있다


그리고 Map도 Set처럼 키가 중복이 안된다


1
2
3
4
5
6
        HashMap<Integer, String> map = new HashMap<>();
        
        map.put(1"첫번째");
        map.put(1"두번째");
        
        System.out.println(map.get(1));
cs


이렇게 키가 동일하면

첫번째 사용한 것은 날라가고 

두번째로 put한 1, "두번째" 만 사용이 가능하다


키가 아닌 값의 경우에는 중복이 허용되지만

키의 경우에는 이렇게 날라가는 것을 알아둬야 한다


마지막으로 HashMap, TreeMap, HashTable, LinkedHashMap을 알아보자


HashMap은 계속 썼지만

HashMap의 특징을 꼽아보자면


1. 키값의 중복이 안된다.

2. put을 한 순서대로 들어가지 않고 기준없이 막 들어간다 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        HashMap<Integer, Integer> map = new HashMap<>();
        
        map.put(501);
        map.put(102);
        map.put(102);
        map.put(403);
        map.put(403);
        map.put(24);
        map.put(705);
        map.put(96);
        
        Set set = map.entrySet(); 
        Iterator iter = set.iterator();
        
        while(iter.hasNext()) {
            System.out.println(iter.next());
        }
cs





예제를 통해 보면 중복 값은 뒤에 하나만 출력되면

put 순서와 상관없이 출력되는 것을 볼 수 있다


다음은 TreeMap인데

TreeMap의 특징은


1. key의 값에 따라 자동 정렬

2. 자동 정렬때문에 대량의 데이터를 삽입, 삭제시 다른 Map보다 오래 걸린다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
        TreeMap<Integer, Integer> map = new TreeMap<>();
        
        map.put(501);
        map.put(102);
        map.put(102);
        map.put(403);
        map.put(403);
        map.put(24);
        map.put(705);
        map.put(96);
        
        Set set = map.entrySet(); 
        Iterator iter = set.iterator();
        
        while(iter.hasNext()) {
            System.out.println(iter.next());
        }
cs


TreeMap을 사용해서 출력해 봤더니

key 값에 따라서 자동으로 정렬이 되어있는 모습이 보인다


3번째는 HashTable인데

간단한 특징은


1. key와 value에 null을 쓸 수 없다!

2. 동기화가 지원된다!! ( 그래서 HashMap보다 느림 )


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        Hashtable<Integer, Integer> map = new Hashtable<>();
        
        map.put(501);
        map.put(102);
        map.put(403);
        map.put(24);
        map.put(705);
        map.put(96);
        
        Set set = map.entrySet(); 
        Iterator iter = set.iterator();
        
        while(iter.hasNext()) {
            System.out.println(iter.next());
        }
cs


HashMap과 동일하게 근본없는 순서로 출력되는데

다만 HashTable은 put 시에 key나 value에 null을 넣으면 에러가 뜬다



마지막으로는 LinkedHashMap인데


하나 있는 특징은 

1. put을 한 순서대로 정렬이 된다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
        LinkedHashMap<Integer, Integer> map = new LinkedHashMap<>();
        
        map.put(501);
        map.put(102);
        map.put(403);
        map.put(24);
        map.put(705);
        map.put(96);
        
        Set set = map.entrySet(); 
        Iterator iter = set.iterator();
        
        while(iter.hasNext()) {
            System.out.println(iter.next());
        }
cs


LinkedHashMap이 put 순서에 따라 정렬이 된 것이 보인다


마지막으로 정리하자면


Map은 다른 배열들과 다르게 

키와 키값을 동시에 받아 키값을 이용해 출력하며


키 중복은 불가능하고, 키와 값 부분에 null 사용이 가능하다


HashMap, TreeMap, HashTable, LinkedHashMap 4가지로 나뉘는데


HashMap - 중복 안됨, 정렬 순서 없음

TreeMap - 키 값에 따라 정렬

HashTable - null 사용 불가, 정렬 순서 없음

LinkedHashMap - put 한 순서에 따라 정렬



1
2
        Integer[] key = map.keySet().toArray(new Integer[map.size()]);
        Integer[] value = map.values().toArray(new Integer[map.size()]);
cs


마지막으로 map 또한 배열로 만들 수 있는데

key값과 value 두개로 이루어지는 만큼


변수 자료형[] 배열명 = map명.keySet() OR values().toArray(new 키 OR 값 자료형[map명.size()] )

를 통해 배열로 변환이 가능하다

( keySet()은 키값, values()는 값을 의미한다.)

반응형

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

자바 Queue 알아보기  (0) 2019.02.12
자바 Stack 알아보기  (0) 2019.02.11
자바 Set(HashSet, TreeSet, LinkedHashSet)  (0) 2019.02.02
자바 List(ArrayList, LinkedList)  (0) 2019.01.31
자바 접근제어자(Access Modifier)  (0) 2019.01.30

댓글