Map은 키-값의 쌍을 저장하는 자료 구조이다.
- 키는 맵 내에서 유일해야 한다. 그리고 키를 통해 값을 빠르게 검색할 수 있다.
- 키는 중복될 수 없지만, 값은 중복될 수 있다.
Map은 순서를 유지하지 않는다.
메서드 설명 put(K key, V value)지정된 키와 값을 맵에 저장한다.(같은 키가 있으면 값 변경) putAll(Map<? extends K, ? extends V> m)지정된 맵의 모든 매핑을 현재 맵에 복사한다. putIfAbsent(K key, V value)지정된 키가 없는 경우에 키와 값을 맵에 저장한다. get(Object key)지정된 키에 연결된 값을 반환한다. getOrDefault(Object key, V defaultValue)지정된 키에 연결된 값을 반환한다. 키가 없는 경우 defaultValue로 지정한 값을 대신 반환한다.remove(Object key)지정된 키와 그에 연결된 값을 맵에서 제거한다. clear()맵에서 모든 키와 값을 제거한다. containsKey(Object key)맵이 지정된 키를 포함하고 있는지 여부를 반환한다. containsValue(Object value)맵이 하나 이상의 키에 지정된 값을 연결하고 있는지 여부를 반환한다. keySet()맵의 키들을 Set형태로 반환한다.values()맵의 값들을 Collection형태로 반환한다.entrySet()맵의 키-값 쌍을 Set<Map.Entry<K, V>>형태로 반환한다.size()맵에 있는 키-값 쌍의 개수를 반환한다. isEmpty()맵이 비어 있는지 여부를 반환한다.
Set<String> keySet = studentMap.keySet()
Map의 키는 중복을 허용하지 않는다. 따라서Map의 모든 키 목록을 조회하는keySet()을 호출하면, 중복을 허용하지 않는 자료 구조인Set을 반환한다.
Map은 키와 값을 보관하는 자료 구조이다. 따라서 키와 값을 하나로 묶을 수 있는 방법이 필요하다. 이때Entry를 사용한다.
Entry는 키-값의 쌍으로 이루어진 간단한 객체이다.Entry는Map내부에서 키와 값을 함께 묶어서 저장할 때 사용한다.
쉽게 이야기해서 우리가Map에 키와 값으로 데이터를 저장하면Map은 내보에서 키와 값을 하나로 묶는Entry객체를 만들어서 보관한다. 참고로 하나의Map에 여러Entry가 저장될 수 있다.
참고로Entry는Map내부에 있는 인터페이스이다. 우리는 구현체보다는 이 인터페이스를 사용하면 된다.
Collection<Integer> values = studentMap.values()
Map의 값 목록을 중복을 허용한다. 따라서 중복을 허용하지 않는Set으로 반환할 수는 없다. 그리고 입력 순서를 보장하지 않기 때문에 순서를 보장하는List로 반환하기도 애매하다. 따라서 단순히 값의 모음이라는 의미의 상위 인터페이스인Collection으로 반환한다.
자바의
Map인터페이스는 키-값 쌍을 저장하는 자료 구조이다.Map은 인터페이스이기 때문에, 직접 인스턴스를 생성할 수는 없고, 대신Map인터페이스를 구현한 여러 클래스를 통해 사용할 수 있다. 대표적으로HashMap,TreeMap,LinkedHashMap이 있다.
그런데
Map을 어디서 많이 본 것 같지 않은가?Map의 키는 중복을 허용하지 않고, 순서를 보장하지 않는다.
Map의 키가 바로Set과 같은 구조이다. 그리고Map은 모든 것이Key를 중심으로 동작한다.
Value는 단순히Key옆에 따라 붙은 것 뿐이다.Key옆에Value만 하나 추가해주면Map이 되는 것이다.
Map과Set은 거의 같다. 단지 옆에Value를 가지고 있는가 없는가의 차이가 있을 뿐이다.
이런 이유로Set과Map의 구현체는 거의 같다.
HashSet -> HashMapLinkedHashSet -> LinkedHashMapTreeSet -> TreeMap
참고: 실제로 자바HashSet의 구현은 대부분HashMap의 구현을 가져다 사용한다.Map에서Value만 비워두면Set으로 사용할 수 있다.
- 구조:
HashMap은 해시를 사용해서 요소를 저장한다. 키(Key) 값은 해시 함수를 통해 해시 코드로 변환되고, 이 해시 코드는 데이터를 저장하고 검색하는 데 사용된다.- 특징: 삽입, 삭제, 검색 작업은 해시 자료 구조를 사용하므로 일반적으로 상수 시간
O(1)의 복잡도를 가진다.- 순서: 순서를 보장하지 않는다.
- 구조:
LinkedHashMap은HashMap과 유사하지만, 연결 리스트를 사용하여 삽입 순서 또는 최근 접근 순서에 따라 요소를 유지한다.- 특징: 입력 순서에 따라 순회가 가능하다.
HashMap과 같지만 입력 순서를 링크로 유지해야 하므로 조금 더 무겁다.- 성능:
HashMap과 유사하게 대부분의 작업은O(1)의 시간 복잡도를 가진다.- 순서: 입력 순서를 보장한다.
- 구조:
TreeMap은 레드-블랙 트리를 기반으로 한 구현이다.- 특징: 모든 키는 자연 순서 또는 생성자에 제공된
Comparator에 의해 정렬된다.- 성능:
get,put,remove와 같은 주요 작업들은O(log n)의 시간 복잡도를 가진다.- 순서: 키는 정렬된 순서로 저장된다