📔 학습한 내용을 정리하기 위해 작성하는 게시글입니다.
Collection<E>
인터페이스를 상속받는 List<E>
, Set<E>
와 달리, 별도의 인터페이스로 존재함
Key와 Value를 한 쌍으로 데이터를 저장(엔트리)
→ Key의 중복 허용 X, Value의 중복 허용 O
→ Key는 고유값, Value없이 Key만 저장 가능(Key없이 Value만 저장 불가)
저장 순서가 유지되지 않음(비정렬)
삽입, 삭제, 조회 연산이 빠르지만 순서가 보장되지 않고 정렬이 불가능함
Map<K, V>
인터페이스를 구현한 대표적인 클래스로는 HashMap<K, V>
, Hashtable<K, V>
, TreeMap<K, V>
가 있음
Key와 Value 한 쌍의 데이터를 엔트리(Entry)라고 하며, Map.Entry 타입으로 정의된다.
구분 | 리턴 타입 | 메서드명 | 기능 |
---|---|---|---|
데이터 추가 | V | put(K key, V value) | 입력매개변수의 (key, value)를 Map 객체에 추가 |
void | putAll(Map<? extends K, ? extends V> m) | 입력매개변수의 Map 객체를 통째로 추가 | |
데이터 변경 | V | replace(K key, V value) | Key에 해당하는 값을 Value 값으로 변경(old값 리턴) (단, 해당 Key가 없으면 null 리턴) |
boolean | replace(K key, V oldValue, V newValue) | (key, oldValue)의 쌍을 갖는 엔트리에서 oldValue를 newValue로 변경(단, 해당 엔트리가 없으면 false를 리턴) | |
데이터 정보 추출 | V | get(Object key) | 매개변수의 Key 값에 해당하는 oldValue를 리턴 |
boolean | containsKey(Object key) | 매개변수의 Key 값이 포함돼 있는지 여부 | |
boolean | containsValue(Object value) | 매개변수의 Value 값이 포함돼 있는지 여부 | |
Set | keySet() | Map 데이터들 중 key들만 뽑아 Set 객체로 리턴 | |
Set<Entry<K, V>> | entrySet() | Map의 각 엔트리들을 Set 객체로 담아 리턴 | |
int | size() | Map에 포함된 엔트리의 개수 | |
데이터 삭제 | V | remove(Object key) | 입력매개변수의 Key를 갖는 엔트리 삭제(단, 해당 Key가 없으면 아무런 동작을 하지 않음) |
boolean | remove(Object key, Object value) | 입력매개변수의 (key, value)를 갖는 엔트리 삭제(단, 해당 엔트리가 없으면 아무런 동작을 하지 않음) | |
void | clear() | Map 객체 내의 모든 데이터 삭제 |
Map<K, V> 객체명 = new HashMap<K, V>();
Map<K, V>
인터페이스를 구현한 대표적인 구현 클래스(HashTable<K, V>
의 신버전)HashSet<E>
의 경우와 완전히 동일)HashSet<E>
로 구현한 Map<K, V>
객체해시 알고리즘(hash algorithm)이란?
해시 함수(hash function)를 사용하여 데이터를 해시 테이블(hash table)에 저장하고, 다시 그것을 검색하는 알고리즘
public class Ex14_HashMap {
public static void main(String[] args) {
HashMap<String, String> map = new HashMap<>();
//Key-Value 기반 데이터 저장
map.put("홍길동", "010-1234-1443");
map.put("전우치", "010-4321-1446");
map.put("손오공", "010-9876-1443");
//데이터 탐색
System.out.println("홍길동: " + map.get("홍길동"));
System.out.println("전우치: " + map.get("전우치"));
System.out.println("손오공: " + map.get("손오공"));
System.out.println();
//데이터 삭제
map.remove("손오공");
//데이터 삭제 확인
System.out.println("손오공: " + map.get("손오공"));
}
}
홍길동: 010-1234-1443
전우치: 010-4321-1446
손오공: 010-9876-1443
손오공: null
Map<K, V> 객체명 = new Hashtable<K, V>();
HashMap<K, V>
구현 클래스가 단일 쓰레드에 적합한 반면, HashTable
은 멀티 쓰레드에 안정성을 가짐HashMap<K, V>
과 동일한 특징을 가짐Map<K, V> 객체명 = new LinkedHashMap<K, V>();
HashMap<K, V>
의 기본적인 특성에 입력 데이터의 순서 정보를 추가로 갖고 있는 컬렉션LinkedHashSet<E>
로 관리함Map<K, V> 객체명 = new TreeMap<K, V>(); → Map<K, V> 메서드만 사용 가능
TreeMap<K, V> 객체명 = new TreeMap<K, V>(); → Map<K, V> 메서드와 추가된 정렬/검색 메서드 사용 가능
Map<K, V>
의 기본 기능에 정렬(Key값의 크기에 따라 오름차순 정렬) 및 검색 기능이 추가된 컬렉션NavigableMap<K, V>
와 SortedMap<K, V>
를 부모 인터페이스로 둠TreeMap<K, V>
생성자로 객체를 생성해도 Set<K, V>
타입으로 선언하면 정렬 및 검색 기능 사용 할 수 없음HashMap<K, V>
보다 데이터 추가, 삭제 시간이 오래 소요Comparable
, Comparator
인터페이스를 구현TreeMap<K, V>
정렬 기준 : 숫자 > 알파벳 대문자 > 알파벳 소문자 > 한글이진 탐색 트리(Binary Search Tree, BST)란?
//key, value값 출력 방법은 HashMap도 동일함
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;
public class Ex16_TreeMapKeySet {
public static void main(String[] args) {
TreeMap<String, Integer> map = new TreeMap<>();
//Key-Value 기반 데이터 저장
map.put("홍길동", 20);
map.put("전우치", 25);
map.put("손오공", 27);
//Key만 담고 있는 컬렉션 인스턴스 생성
Set<String> ks = map.keySet();
//전체 Key 출력(향상된 기능의 for문 기반)
for(String s : ks)
System.out.print(s + '\t');
System.out.println();
//전체 Value 출력(향상된 기능의 for문 기반)
for(String s : ks)
System.out.print(map.get(s).toString() + '\t');
System.out.println();
//전체 Value 출력(반복자 기반)
for(Iterator<String> itr = ks.iterator(); itr.hasNext();)
System.out.print(map.get(itr.next()).toString() + '\t');
System.out.println();
}
}
손오공 전우치 홍길동
27 25 20
27 25 20
컬렉션 | 데이터 중복(K, V) | 저장 순서 유지 | 정렬 | 구현 방식 | 동기화 지원 |
---|---|---|---|---|---|
HashMap<K, V> | (X, O) | X(임의 순서로 저장) | 불가능 | LinkedList로 연결된 배열 | X |
HashTable<K, V> | (X, O) | X(임의 순서로 저장) | 불가능 | LinkedList로 연결된 배열 | O |
LinkedHashMap<K, V> | (X, O) | O(FIFO, 선입선출) | 불가능 | double-linked bucket | X |
TreeMap<K, V> | (X, O) | O(오름차순) | Key를 기준으로 오름차순으로 정렬 | Red-Black-Tree(*key는 Comparable 구현) | X |
Map을 써야하는데 정렬이 불가피하다면 TreeMap,
Map을 써야하는데 정렬은 필요없지만 삽입순서를 기억해야한다면 LinkedHashMap, 그 외에는 가장 효율적이고 빠른 HashMap을 기본적으로 사용한다.(HashTable은 과거에 사용하던 클래스로 현재는 더 이상 지원하지 않는 클래스이니 사용을 지양하는것이 좋다.)
<이재환의 자바 프로그래밍 입문>
<Do it! 자바 완전 정복>
http://www.tcpschool.com/java/java_collectionFramework_set
https://bangu4.tistory.com/205
https://hwan1001.tistory.com/10
https://escapefromcoding.tistory.com/143