오늘의하루

[JAVA] Map 관련 내용 본문

JAVA

[JAVA] Map 관련 내용

오늘의하루_master 2022. 8. 19. 15:42
반응형

HashMap과 Hashtable은 Map 인터페이스를 구현한 대표 클래스이고 데이터를 키와 값 쌍으로 저장한다.

  • HashMap(신버전)은 동기화 x, Hashtable(구버전)은 동기화 o
  • Map은 데이터의 순서가 없으며, 키의 중복은 허용하지 않고 값의 중복은 허용한다.

HashMap

순서가 없는 Map에서 순서를 유지하려면 LinkedHashMap 클래스를 사용하면 된다.

  • 해싱(hashing) 기법으로 데이터를 저장(put)하며 데이터가 많아도 검색 속도가 빠르다.
    • hashing이란? 해시 함수를 이용해서 해시 테이블에 데이터를 저장하고 읽어온다.
      • 해시 테이블은 배열(접근성)과 LinkedList(변경 유리)가 조합된 상태이다.
더보기

TreeMap

범위 검색과 정렬에 유리한 컬렉션 클래스이며 HashMap보다 데이터 추가, 삭제의 효율성이 떨어진다.

  • TreeSet처럼 데이터를 정렬해서 저장하기 때문에 저장시간이 길다.
    • TreeSet은 TreeMap을 이용해서 구현되어 있다.
  • 다수의 데이터에서 개별적인 검색은 TreeMap보다 HashMap이 빠르다.
  • Map이 필요할때 주로 HashMap을 사용하고, 정렬이나 범위검색이 필요한 경우 TreeMap을 사용한다.

Hashtable에 저장된 데이터를 가져오는 과정

  1. 키로 해시함수를 호출해서 HashCode를 얻는다.
  2. HashCode에 대응하는 LinkedList를 배열에서 찾는다.
  3. LinkedList에서 키(key)와 일치하는 데이터를 찾는다.
    • 해시 함수는 같은 키(key)에 대해 항상 같은 hashcode를 반환해야 한다.
    • 서로 다른 키(key)일지라도 같은 값의 hashcode가 반환될 수 있다.
HashMap map = new HashMap(); // 생성자
map.put("Myid", "1234");
map.put("asdf", "1111");
map.put("asdf", "1234"); // key가 중복 되면 같은 key에서 무조건 마지막값(value)으로 저장된다.

// 결과
// key   value
// Myid  1234
// asdf  1234

HashMap의 주요 메서드

생성자

  • HashMap() : 기본 생성자
  • HashMap(int initialCapacity) : 생성자(초기 용량)
  • HashMap(int initialCapacity, float loadFactor) : 초기 용량을 지정하고 언제 용량을 늘릴지 loadFactor로 지정한다.
  • HashMap(Map m) : 지정된 Collection(m)을 저장하는 생성자

추가, 삭제, 변경

  • Object put(Object key, Object value) : 추가
  • Object putAll(Map m) : 추가
  • Object remove(Object key) : 삭제
  • Object replace(Object key, Object value) : 변경
  • boolean replace(Object key, Object oldValue, Object newValue) : 변경

읽기

  • Set entrySet() : key와 value를 쌍으로 가져온다.
  • Set keySet() : key만 가져온다.
  • Collection values() : value만 가져온다.
  • Object get(Object key) : 지정된 키(key)에 해당하는 value를 반환한다.
  • Object getOrDefault(Object key, Object defaultValue) : 지정된 키(key)가 없을 때 고정된 값(defaultValue)을 반환한다.
  • boolean containsKey(Object key) : 키(key)가 현재 HashMap에 존재하는지 확인한다.
  • boolean containsValue(Object value) : 값(value)이 현재 HashMap에 존재하는지 확인한다.

예제로 알아보기

import java.util.*;

public class MyClass {
    public static void main(String args[]) {
      HashMap map = new HashMap();
      map.put("myid", "1234");
      map.put("asdf", "1111");
      map.put("myid", "1234");
      map.put("zxcv", 90);
      Scanner s = new Scanner(System.in);
      while(true){
          System.out.println("id, pw input >>");
          System.out.print("id :  ");
          String id = s.nextLine().trim();
          System.out.print("pw :  ");
          String pw = s.nextLine().trim();
          System.out.println();
          if(!map.containsKey(id)){
              System.out.println("The id entered does not exist.");
          }
          if(!(map.get(id).equals(pw))){
              System.out.println("Passwords do not match.");
          }else{
              System.out.println("Success!");
              break;
          }
      }
      
      HashMap map2 = new HashMap();
      map2.put("jang",90);
      map2.put("jang",new Integer(100));
      map2.put("choi",new Integer(100));
      map2.put("hong",new Integer(80));
      map2.put("wuri",new Integer(90));
      
      // Map은 iterator를 그냥 사용할 수 없다.
      Set set = map2.entrySet(); 
      Iterator it = set.iterator();
      
      while(it.hasNext()){
          Map.Entry e = (Map.Entry)it.next(); // e를 출력하면 어떤 형태일까? jang=100 
          System.out.println("name = " + e.getKey() + " score = " + e.getValue());
      }
      /*
      결과 ( Map은 순서가 없다. )
      name = hong score = 80
      name = jang score = 100
      name = choi score = 100
      name = wuri score = 90
      */
      set = map2.keySet(); // 키(key)만 가져온다
      System.out.println("list of participants = " + set);
      Collection values = map2.values(); // 값(value)만 가져온다
      it = values.iterator();
      int total = 0;
      while (it.hasNext()){
          int i = (int)it.next();
          total = total + i;
      }
      System.out.println("total score = " + total);
      System.out.println("average score = " + (float)total/set.size());
      System.out.println("max score = " + Collections.max(values));
      System.out.println("min score = " + Collections.min(values));
      
      
      String[] data = {"A","k","A","W","D","A","k","k","Z","D"};
      HashMap map3 = new HashMap();
      for (int j = 0; j < data.length; j++){
          if(map3.containsKey(data[j])){
              int value = (int)map3.get(data[j]);
              map3.put(data[j], value + 1);
          }else{
              map3.put(data[j], 1);
          }
      }
      Set set2 = map3.entrySet();
      Iterator it2 = set2.iterator();
        
      while(it2.hasNext()){
          Map.Entry e = (Map.Entry)it2.next();
          // e의 형태는 A=3 이런식으로 나온다.
          int value = (int)e.getValue();
          System.out.println(e.getKey() + " : " + printBar('#',value) + " " + value);
      }
    }
        static String printBar(char c, int a){
            char[] cArr = new char[a];
            for (int k = 0 ; k < a; k ++){
              cArr[k] = c;
            }
            return new String(cArr);
        }
}
반응형

'JAVA' 카테고리의 다른 글

[JAVA] Generics 정의 및 타입변수, 다형성  (0) 2022.08.23
Java 객체지향 공부 다형성, interface, 상속, 포함 등  (0) 2022.08.22
[JAVA] TreeSet  (0) 2022.08.19
[JAVA] HashSet  (0) 2022.08.18
[JAVA] Iterator Method 관련 내용  (0) 2022.08.18
Comments