Map인터페이스
Map인터페이스는 Collection 인터페이스와 다른 저장방식을 가진다. Map인터페이스를 구현한 Map 컬렉션 클래스들은 키와 값을 하나의 쌍으로 저장하는 방식을 사용한다. 요소의 저장순서를 유지하지 않으며 키는 중복을 허용하지 않지만 값의 중복은 허용한다.
- Map인터페이스를 구현한 대표적인 컬렉션 클래스
HashMap
Hashtable
* Hashtable와 HashMap은 거의 같지만 Hashtable은 동기화가 되어있고 HashMap은 동기화가 되어있지 않다는 차이가 있다.
* 순서를 유지할 필요가 있다면 LinkedHashMap
TreeMap
* TreeSet과 마찬가지로 이진 탐색 트리구현
* LinkedHashMap은 순서를 추가한 HahsMap을 말한다.
Map 인터페이스의 메서드
HashMap
Map 인터페이스를 구현한 대표적인 컬렉션 클래스
Map 인터페이스를 구현하여 데이터를 키와 값의 쌍으로 저장한다.
키(key) : 컬렉션 내의 키(key)중에서 유일해야 한다.
값(value) : 키(key)와 달리 데이터의 중복을 허용한다.
Entry : 키와 값 한쌍을 의미한다.
- 해싱 기법으로 데이터를 저장하여 데이터가 많아도 검색이 빠르다.
- 해시함수(hash function)로 해시 테이블(hash table)에 데이터를 저장, 검색
해시 코드를 사용하여 배열에 바로 접근이 가능하다.
해시 코드 : 배열의 인덱스
- 해시 테이블은 배열과 링크드 리스트가 조합된 형태
2차원 배열과 같은 형태라 테이블이라 부른다. 링크드 리스트의 장점인 변경에 유리한 것과 배열의 장점인 접근성이 좋은 것을 합친것으로 검색에 매우 유리하다.
- 해시 테이블에 저장된 데이터를 가져오는 과정
1. 키로 해시함수를 호출해서 해시 코드를 얻는다.(배열의 인덱스)
2. 해시 코드(해시함수의 반환 값)에 대응하는 링크드 리스트를 배열에서 찾는다.
3. 링크드 리스트에서 키와 일치하는 데이터를 찾는다.
* 해시함수는 같은 키에 대해 항상 같이 해시 코드를 반환해야 한다. 서로 다른 키일지라도 같은 값의 해시 코드를 반환할 수 있다.
HashMap의 생성자와 주요 메서드
- 생성자
생성자 | 설명 |
HashMap() | HashMap 객체를 생성 |
HashMap(int initialCapacity) | 지정된 값을 초기용량으로 하는 hashMap 객체를 생성 |
HashMap(int initialCapacity, float loadFactor) | 지정된 초기용량과 load factor의 HashMap객체를 생성 |
HashMap(Map m) | 지정된 Map의 모든 요소를 포함하는 HashMap을 생성 |
- 메서드
메서드 | 설명 |
Object put(Object key, Obejct value) | 지정된 키와 값을 HashMap에 저장 |
void putAll(Map m) | Map에 저장된 모든 요소를 HashMap에 저장 |
Object remove(Object key) | HashMap에서 지정된 키로 저장된 값(객체)를 제거 |
Object replace(Obejct key, Obejct value) | 지정된 키의 값을 지정된 객체(value)로 대체 |
boolean replace(Object key, Object oldVal, Obejct newVal) | 지정된 키와 객체(oldVal)가 모두 일치하는 경우에만 새로운 객체(newVal)로 대체 |
boolean containsKey(Object key) | HashMap에 지정된 키(key)가 포함되어있는지 알려준다. (포함되어 있으면 true) |
boolean containsValue(Object value) | HashMap에 지정된 값(value)가 포함되어있는지 알려준다. (포함되어 있으면 true) |
Object get(Object key) | 지정된 키(key)의 값(객체)을 반환. 못찾으면 null 반환 |
Object getOrDefault(Object key, Object defaultValue) | 지정된 키(key)의 값(객체)을 반환한다. 키를 못찾으면, 기본값(defaulsValue)로 지정된 객체를 반환 |
Set entrySet() | HashMap에 저장된 키와 값을 엔트리(키와 값의 결합)의 형태로 Set에 저장해서 반환 |
Set keySet() | HashMap에 저장된 모든 키가 저장된 Set을 반환 |
Collection values() | HashMap에 저장된 모든 값을 컬렉션의 형태로 반환 |
void clear() | HashMap에 저장된 모든 객체를 제거 |
boolean isEmptry() | HashMap이 비어있는지 알려준다. |
int size() | HashMap에 저장된 요소의 개수를 반환 |
- entrySet()을 이욥해 map에 저장된 데이터를 불러오는 예시
public class Main {
// entrySet()을 이욥해 map에 저장된 데이터를 불러오는 예시
public static void main(String[] args) {
HashMap map = new HashMap();
// 키(Key)와 값(value)
map.put("김묵직", new Integer(90));
map.put("김단단", new Integer(80));
map.put("김인직", new Integer(90));
// HashMap에 저장된 키와 값을 엔트리(키와 값의 결합)의 형태로 Set에 저장해서 반환
Set set = map.entrySet();
Iterator it = set.iterator();
while(it.hasNext()) {
// Map 인터페이스의 내부 인터페이스인 Entry 인터페이스
Map.Entry e = (Map.Entry)it.next();
System.out.println("이름 : "+ e.getKey() + " 점수 : " + e.getValue());
}
}
}
TreeMap
TreeMap 클래스는 TreeSet와 마찬가지로 키와 값을 한 쌍으로 하는 데이터를 이진 검색 트리(binary search tree)의 형태로 저장된다. 따라서 TreeSet 같은 특성을 가지며 범위 검색과 정렬에 유리한 컬렉션 클래스이다.
다수의 데이터에서 개별적인 검색은 TreeMap보다 HashMap이 빠르며 TreeMap은 범위 검색과 정렬에 유리하기 때문에 Map이 필요할 때 주로 HashMap을 사용하고, 정렬이나 범위 검색이 필요한 경우에 TreeMap을 사용한다.
HashMap보다 데이터 추가/삭제에 시간이 더 걸린다.(비교 횟수 증가에 따라)
TreeMap의생성자와 주요 메서드
- 생성자
생성자 | 메서드 |
TreeMap() | TreeMap객체를 생성 |
TreeMap(Comparator c) | 지정된 Comparator를 기준으로 정렬하는 TreeMap객체를 생성 |
TreeMap(map m) | 주어진 Map에 저장된 모든 요소를 포함하는 TreeMap을 생성 |
TreeMap(SortedMap m) | 주어진 SortedMap에 저장된 모든 요소를 포함하는 TreeMap을 생성 |
- 메서드
메서드 | 설명 |
Map.Entry<K, V> ceilingEntry(K key) | 해당 맵에서 전달된 키와 같거나, 전달된 키보다 큰 키 중에서 가장 작은 키와 그에 대응하는 값의 엔트리를 반환함. 만약 해당하는 키가 없으면 null을 반환함. |
K ceilingKey(K key) | 해당 맵에서 전달된 키와 같거나, 전달된 키보다 큰 키 중에서 가장 작은 키를 반환함. 만약 해당하는 키가 없으면 null을 반환함. |
void clear() | 해당 맵(map)의 모든 매핑(mapping)을 제거함. |
boolean containsKey(Object key) | 해당 맵이 전달된 키를 포함하고 있는지를 확인함. |
boolean containsValue(Object value) | 해당 맵이 전달된 값에 해당하는 하나 이상의 키를 포함하고 있는지를 확인함. |
NavigableMap<K, V> descendingMap() | 해당 맵에 포함된 모든 매핑을 역순으로 반환함. |
Set<Map.Entry<K, V>> entrySet() | 해당 맵에 포함된 모든 매핑을 Set 객체로 반환함. |
Map.Entry<K, V> firstEntry() | 해당 맵에서 현재 가장 작은(첫 번째) 키와 그에 대응하는 값의 엔트리를 반환함. |
K firstKey() | 해당 맵에서 현재 가장 작은(첫 번째) 키를 반환함. |
Map.Entry<K, V> floorEntry(K key) | 해당 맵에서 전달된 키와 같거나, 전달된 키보다 작은 키 중에서 가장 큰 키와 그에 대응하는 값의 엔트리를 반환함. 만약 해당하는 키가 없으면 null을 반환함. |
K floorKey(K key) | 해당 맵에서 전달된 키와 같거나, 전달된 키보다 작은 키 중에서 가장 큰 키를 반환함. 만약 해당하는 키가 없으면 null을 반환함. |
V get(Object key) | 해당 맵에서 전달된 키에 대응하는 값을 반환함. 만약 해당 맵이 전달된 키를 포함한 매핑을 포함하고 있지 않으면 null을 반환함. |
SortedMap<K, V> headMap(K toKey) | 해당 맵에서 전달된 키보다 작은 키로 구성된 부분만을 반환함. |
Map.Entry<K, V> higherEntry(K key) | 해당 맵에서 전달된 키보다 작은 키 중에서 가장 큰 키와 그에 대응하는 값의 엔트리를 반환함. 만약 해당하는 키가 없으면 null을 반환함. |
K higherKey(K key) | 해당 맵에서 전달된 키보다 작은 키 중에서 가장 큰 키를 반환함.만약 해당하는 키가 없으면 null을 반환함. |
Set<K> keySet() | 해당 맵에 포함되어 있는 모든 키로 만들어진 Set 객체를 반환함. |
Map.Entry<K, V> lastEntry() | 해당 맵에서 현재 가장 큰(마지막) 키와 그에 대응하는 값의 엔트리를 반환함. |
K lastKey() | 해당 맵에서 현재 가장 큰(마지막) 키를 반환함. |
Map.Entry<K, V> lowerEntry(K key) | 해당 맵에서 전달된 키보다 큰 키 중에서 가장 작은 키와 그에 대응하는 값의 엔트리를 반환함. 만약 해당하는 키가 없으면 null을 반환함. |
K lowerKey(K key) | 해당 맵에서 전달된 키보다 큰 키 중에서 가장 작은 키를 반환함. 만약 해당하는 키가 없으면 null을 반환함. |
Map.Entry<K, V> pollFirstEntry() | 해당 맵에서 현재 가장 작은(첫 번째) 키와 그에 대응하는 값의 엔트리를 반환하고, 해당 엔트리를 맵에서 제거함. |
Map.Entry<K, V> pollLastEntry() | 해당 맵에서 현재 가장 큰(마지막) 키와 그에 대응하는 값의 엔트리를 반환하고, 해당 엔트리를 맵에서 제거함. |
V put(K key, V value) | 해당 맵에 전달된 키에 대응하는 값으로 특정 값을 매핑함. |
V remove(Object key) | 해당 맵에서 전달된 키에 대응하는 매핑을 제거함. |
boolean remove(K key, V value) | 해당 맵에서 특정 값에 대응하는 특정 키의 매핑을 제거함. |
V replace(K key, V value) | 해당 맵에서 전달된 키에 대응하는 값을 특정 값으로 대체함. |
boolean replace(K key, V oldValue, V newValue) | 해당 맵에서 특정 값에 대응하는 전달된 키의 값을 새로운 값으로 대체함. |
int size() | 해당 맵의 매핑의 총 개수를 반환함. |
SortedMap<K, V> subMap(K fromKey, K toKey) | 해당 맵에서 fromKey부터 toKey까지로 구성된 부분만을 반환함.이때 fromKey는 포함되나, toKey는 포함되지 않음. |
SortedMap<K, V> tailMap(K fromKey) | 해당 맵에서 fromKey와 같거나, fromKey보다 큰 키로 구성된 부분만을 반환함. |
'Java' 카테고리의 다른 글
[JAVA] 제네릭(Generics) (0) | 2023.11.25 |
---|---|
[JAVA] Collections 클래스 (0) | 2023.11.24 |
[JAVA] Set 인터페이스 (0) | 2023.11.10 |
[JAVA] Comparator와 Comparable 인터페이스 (0) | 2023.11.08 |
[JAVA] 컬렉션 프레임웍(collections framework)와 핵심 인터페이스 (0) | 2023.11.08 |