wisePocket

[JAVA] 기초문법 - 자료구조 컬렉션 Map 생성과 메서드 기능 이용 연습 - 26 본문

Java & Algorithm/Java

[JAVA] 기초문법 - 자료구조 컬렉션 Map 생성과 메서드 기능 이용 연습 - 26

ohnyong 2023. 7. 27. 21:34

Collection - Map

컬렉션은 이전 교육과정에서 좀 어렵다 생각하고 잠깐 놓친 사이에 지나가서 바로 알고리즘~SQL로 넘어가고해서 내가 가장 기본기가 약하다고 느끼던 부분이다. 그래서 블로그보단 집중해서 보려고 노력했다. 얼마나 놓친 부분이 많은지 체감되고있는데, 아직도 이해도가 좀 애매한 구석들이 많다. 조금 다양한 강의나 블로그를 통해서 나를 이해시켜줄만한 무언가 필요하다. 알고리즘과도 연결되는 것도 그렇지만 나중에 프로젝트에서 실제로 자주 쓰이는 부분이기 때문에 걱정이 많다. 여러 사람들이 이해한 방법들을 살펴보면서 나에게 맞는 이해가 될 때 스터디 동료들과 이것들에 대해 이해되는 것들을 공유하고 서로 알려주는 시간을 가져야 겠다.

Map은 프로젝트에서 정말 많이 사용했다. 대부분의 배열을 HashMap을 이용 한 것으로 기억나는데 프로젝트를 한번 다시 살펴보긴 해야겠다. KEY : VALUE 쌍(pair) 중요

  • Key는 Unique 해야 한다.(중복X)
  • 사용해야 하는 경우
    • 1) 정렬해야 한다.
    • 2) 많은 자료를 저장하고, 검색이 빨라야 한다.
    • 3) 빈번하게 삽입, 삭제하지 않는다.
      • ->이러한 이유로 기본적으로 프로젝트 배열들을 다 HashMap으로 사용한 기억이다.
  • 데이터 읽기 성능 : HashMap > LinkedHashMap > HashTable > TreeMap  
  • 키 중복의 경우, 같은 키의 여러 value의 경우 Multimap 사용
  • 정렬이 필요한 경우 TreeMap 사용 (<<<<검색에 있어서 가장 느리다.)
  • 메모리 보다 성능이 우선일 경우 HashMap 사용 (검색에 관해 대부분 O(1) 성능인 HashMap 사용)
  • 일정한 수행시간과 삽입 순서를 유지하는 경우 LinkedHashMap 사용 (입력순서가 중요할 때)
  • Map 클래스(<interface임)
    • HashMap, TreeMap 등 있음
      • HashMap
        • HashMap은 Map interface를 implements 한 클래스로서 중복을 허용하지 않는다. 
        • Map의 특징인 key와 value의 쌍으로 이루어지며, key 또는 value 값으로써 null을 허용한다.
      • Hashtable
        • Hashtable Map interface를 implements 한 클래스로서 중복을 허용하지 않는다.
        • Map의 특징인 key와 value의 쌍으로 이루어지며, key 또는 value 값으로써 null을 허용하지 않는다.(HashMap과의 차이점) 
      • TreeMap
        • TreeMap역시 중복을 허용하지 않으며, key와 value의 쌍으로 이루어져 있다.
        • HashMap과 다른 점은 SortedMap을 implements 하였으므로, key 값들에 대한 정렬이 이루어진다는 점이다.
        • 내부적으로 RedBlack Tree로 저장됨, 키값에 대한 Compartor 구현으로 정렬 순서를 바꿀수 있다.
더보기

HashMap과 TreeMap의 주요 차이점

  1. HashMap은 어떤 순서도 유지하지 않습니다. 즉, HashMap는, 최초로 삽입 된 요소가 최초로 인쇄되는 것을 보증하지 않습니다. TreeSet와 같이, TreeMap 요소도 요소의 자연 순서 부에 따라 소트됩니다
  2. 내부 HashMap 구현은 Hashing을 사용하고 TreeMap은 Red-Black 트리 구현을 내부적으로 사용합니다.
  3. HashMap은 하나의 null 키와 많은 null values를 저장할 수 있습니다. TreeMap은 null 키를 포함 할 수 없지만 많은 null 값을 포함 할 수 있습니다.
  4. HashMap은 O (1)과 같은 get과 put 같은 기본 연산에 대해 일정한 시간 성능을 나타냅니다. 오라클 문서에 따르면 TreeMap은 get 및 put 메소드에 대한 log (n) 시간 보장 비용을 제공합니다.
  5. HashMap의 성능 시간은 대부분의 작업에서 TreeMap에 대해 일정하므로 HashMap은 TreeMap보다 훨씬 빠릅니다.
  6. HashMap은 비교에서 equals () 메소드를 사용하지만 TreeMap은 ordering을 유지하기 위해 compareTo () 메소드를 사용합니다.
  7. HashMap은 Map 인터페이스를 구현하고 TreeMap은 NavigableMap 인터페이스를 구현합니다.

 

HashMap

  1. HashMap 에는 키를 기반으로하는 값이 들어 있습니다.
  2. 고유 한 요소 만 포함합니다.
  3. 하나의 널 (null) 키와 복수의 널 값을 가질 수 있습니다.
  4. 그것은 순서를 유지 하지 않습니다 .
  5. public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable

LinkedHashMap

  1. LinkedHashMap 에는 키를 기반으로 한 값이 들어 있습니다.
  2. 고유 한 요소 만 포함합니다.
  3. 하나의 널 (null) 키와 복수의 널 값을 가질 수 있습니다.
  4. 대신 삽입 순서 를 유지 관리하는 HashMap과 동일합니다. // 아래 클래스 감속을 참조하십시오.
  5. public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

TreeMap

  1. TreeMap 에는 키를 기반으로 한 값이 들어 있습니다. NavigableMap 인터페이스를 구현하고 AbstractMap 클래스를 확장합니다.
  2. 고유 한 요소 만 포함합니다.
  3. null 키는 가질 수 없지만 복수의 널 값을 가질 수 있습니다.
  4. 그것은 HashMap 과 마찬가지로 오름차순 을 유지합니다 (키의 자연 순서를 사용하여 정렬 됨).
  5. public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable

Hashtable

  1. Hashtable은 목록의 배열입니다. 각 목록을 버킷이라고합니다. 버킷의 위치는 hashcode () 메소드를 호출하여 식별됩니다. Hashtable에는 키를 기반으로하는 값이 들어 있습니다.
  2. 고유 한 요소 만 포함합니다.
  3. null 키나 값이없는 경우가 있습니다.
  4. 그것은 동기화 됩니다.
  5. 그것은 레거시 수업입니다.

 

 

 

 


 

Map (Java Platform SE 8 )

If the specified key is not already associated with a value (or is mapped to null), attempts to compute its value using the given mapping function and enters it into this map unless null. If the function returns null no mapping is recorded. If the function

docs.oracle.com


1.  기본 생성법

Map<K, V> name = new HashMap<>();
        Map<String, Integer> intMap = new HashMap<>();

 

2. (Hash)Map의 메서드를 사용

.put(K, V) : Key에 Value 추가
        //Key 값
        intMap.put("일", 11);
        intMap.put("이", 12);
        intMap.put("삼", 11);
        intMap.put("사", 13); // 중복 key
        intMap.put("사", 12); // 중복 key


.keySet() : Map에 있는 Key만 출력 반환
        //key 값 전체 출력(향상된 for문)
        for (String key: intMap.keySet()){
            System.out.println(key);
        }

.values() : Map에 있는 Value만 출력 반환
        //value 값 전체 출력 (향상된 for문)
        for (Integer value: intMap.values()){
            System.out.println(value);
        }
//위 중복 key에서 뒤에 실행된 value가 12인 코드가 위 13을 덮어 써서 12가 출력된다.

.get(Object K) : Key로 value값 반환

        //key로부터 값 가져오기. get()
        System.out.println(intMap.get("삼"));