본문 바로가기

Java

자바 HashMap, LinkedHashMap, TreeMap

자바 HashMap, LinkedHashMap, TreeMap
            
HashMap은 그 안에 들어있는 데이터를 Set 구조(key,value)로 저장하기 때문에,
Set의 원칙대로 중복된 데이터를 허락하지 않으면서 순서가 없다.

쉽게말해 사전(dictionary)과 같다고 생각하면 된다. (python에서 dictionary라는 자료형이 대응됨)
사전에서 단어를 통해 뜻을 찾듯이, hashmap에서는 key를 이용해 value를 꺼내온다.

Map에는 3가지 종류가 있다.
먼저 hash값에 의해 키순서가 정해지는 HashMap이다. 출력엔 순서가 없다. 

HashMap<String, String> hashmap = new HashMap<>();
(제네릭스도 넣어 주어야 함)

hash값이 도대체 무엇인가?

hash는 '으깨다'라는 뜻으로, Hash는 Hash Table을 이용하여 데이터를 저장한다. 각 객체가 다른 코드값을 int로 생성해 인덱스로 사용하는데 이 알고리즘을 구현한 메소드를 Hash Method라고 하며 Hash Method에 의해 반환된 데이터 고유의 숫자 값을 Hash Code 라고 한다.

자바의 모든 클래스가 상속하고 있는 Object에는 hashCode()라는 메소드가 있다.
(객체의 주소값같은 데이터라고 생각하자)

그래서 문자열의 hashCode() 메소드는 같은 값을, 객체의 hashCode() 메소드는 다른 값을 반환한다.   
       

다음은 FIFO(First In First Out, 선입선출) 방식의 LinkedHashMap이다. LinkedList로 저장된다.
FIFO 방식이므로, HashMap과 다르게 출력시 사용자가 입력한 순서대로 출력되게 된다는 특징이 있다.

LinkedHashMap<Integer, String> linkedhashmap = new LinkedHashMap<>();


(FIFO)


마지막으로 키값이 알파벳 순서대로 자동 Sort 되는 방식의 TreeMap이다.
            
TreeMap<String, Integer> treemap = new TreeMap<>();

역시 출력시 랜덤이 아닌 알파벳 순서대로 출력된다.


다음은 사용이다.

put(key, value) : 
추가는 put()으로 한다. 앞서 제네릭스(Generics)를 <String, String>으로 선언해 놓았다.

hashmap.put("홍길동", "01011111111");
hashmap.put("김길수", "01022222222");
hashmap.put("김정은", "01033333333");
System.out.println(hashmap);

{김길수=01022222222, 홍길동=01011111111, 김정은=01033333333}

get(key) :
key를 이용하여 Value를 꺼낸다.
System.out.println(hashmap.get("홍길동"));

01011111111


replace(key, oldvalue, newvalue) :
Value를 교체한다. 
hashmap.replace("홍길동", hashmap.get("홍길동"), "01044444444");
System.out.println(hashmap);

{김길수=01022222222, 홍길동=01044444444, 김정은=01033333333}

하지만, put()을 사용하여 덮어쓰기도 가능하다. 중복을 허용하지 않는 구조이기 때문이다. 이게 더 편리하다.

hashmap.put("홍길동", "01000000000");
System.out.println(hashmap.get("홍길동"));

01000000000

remove(key) :
해당 key와 value를 삭제한다.

hashmap.remove("홍길동");

containsKey(key) : 
해당 키가 존재하는지 boolean 타입으로 리턴한다.
System.out.println(hashmap.containsKey("오바마"));

false

keyset() :
해당 HashMap의 키들을 set<String>으로 리턴해준다. 
출력할때 요긴하게 쓰인다.
System.out.println(hashmap.keySet());

[김길수, 김정은]


출력에는 크게 4가지 방법이 있다.

먼저 그냥 기본 출력이다.
System.out.println("기본 출력: "+hashmap);

기본 출력: {김길수=01022222222, 김정은=01033333333}

    1.forEach를 이용한 출력
      System.out.println("=========출력1=========");
      for (String key : hashmap.keySet()) {
          System.out.println(key + " : "+ hashmap.get(key));
      }

      =========출력1=========
      김길수 : 01022222222
      김정은 : 01033333333
      문법이 간단해 가장 자주 쓰이는 방법이다. 

      2.Iterator를 이용한 출력
      System.out.println("=========출력2=========");
      Set<String> keySet = hashmap.keySet();
      Iterator<String> it = keySet.iterator();
      while(it.hasNext()) {
          String key = it.next();
          String value = hashmap.get(key);
          System.out.println(key+" : "+value);
      }
      Iterator 인터페이스는 따로 포스팅할 예정이다.

      3.
      System.out.println("=========출력3=========");
      for(Map.Entry<String, String> elem : hashmap.entrySet()){
                        
          String key = elem.getKey();
          String value = elem.getValue();
       
          System.out.println(key+" : "+value);
      }


      다음은 포스팅에 사용한 코드 전문.

      Map_.java
      import java.util.HashMap;
      import java.util.Iterator;
      import java.util.LinkedHashMap;
      import java.util.Map;
      import java.util.Set;
      import java.util.TreeMap;
      public class Map_ {
            public static void main(String[] args) {
                  
                  HashMap<String, String> hashmap = new HashMap<>();
                           
                  LinkedHashMap<Integer, String> linkedhashmap = new LinkedHashMap<>();
                              
                  TreeMap<String, Integer> treemap = new TreeMap<>();
                  
                  //추가는 put으로
                  hashmap.put("홍길동", "01011111111");
                  hashmap.put("김길수", "01022222222");
                  hashmap.put("김정은", "01033333333");
                  System.out.println(hashmap);
                  
                  //Value를 꺼낸다: get
                  System.out.println(hashmap.get("홍길동"));
                  
                  //Value를 바꾼다: replace
                  hashmap.replace("홍길동", hashmap.get("홍길동"), "01044444444");
                  System.out.println(hashmap);
                  
                  //Put을 덮어써서 대체할 수도 있다
                  hashmap.put("홍길동", "01000000000");
                  System.out.println(hashmap.get("홍길동"));
                  //삭제는 remove로
                  hashmap.remove("홍길동");
                  
                  //존재하는지 확인
                  System.out.println(hashmap.containsKey("오바마"));
                  
                  //키셋 확인
                  System.out.println(hashmap.keySet());
                  
                  //기본 출력
                  System.out.println("기본 출력: "+hashmap);
                  
                  //출력1 : for each
                  System.out.println("=========출력1=========");
                  for (String key : hashmap.keySet()) {
                        System.out.println(key + " : "+ hashmap.get(key));
                  }
                  
                  //출력2 (Iterator)
                  System.out.println("=========출력2=========");
                  Set<String> keySet = hashmap.keySet();
                  Iterator<String> it = keySet.iterator();
                  while(it.hasNext()) {
                        String key = it.next();
                        String value = hashmap.get(key);
                        System.out.println(key+" : "+value);
                  }
                  
                  //출력3
                  System.out.println("=========출력3=========");
                  for(Map.Entry<String, String> elem : hashmap.entrySet()){
                        
                  String key = elem.getKey();
                  String value = elem.getValue();
       
                  System.out.println(key+" : "+value);
                  }
            }
      }
      {김길수=01022222222, 홍길동=01011111111, 김정은=01033333333}
      01011111111
      {김길수=01022222222, 홍길동=01044444444, 김정은=01033333333}
      01000000000
      false
      기본 출력: {김길수=01022222222, 김정은=01033333333}
      [김길수, 김정은]
      =========출력1=========
      김길수 : 01022222222
      김정은 : 01033333333
      =========출력2=========
      김길수 : 01022222222
      김정은 : 01033333333
      =========출력3=========
      김길수 : 01022222222
      김정은 : 01033333333