[Java] 컬렉션 프레임워크 - Map 인터페이스
Map, SortedMap
Map 인터페이스는 Key와 Value가 하나의 쌍을 이루는 형태로 데이터를 저장한다. Key를 사용하여 Value를 저장하므로, Key는 중복될 수 없으나 Key만 다르면 Value는 중복 가능하다.
SortedMap 인터페이스는 Map을 상속하는 인터페이스로, Key의 값에 따라 정렬을 유지한다. SortedMap에 사용되는 Key는 반드시 Comparable 인터페이스를 구현하거나 Map 인스턴스 생성단계에서 Comparator 구현 인스턴스를 등록해야한다.
Map<Integer, String> map = new HashMap<>();
Set<Integer> ks = map.keySet();
Map 구현 클래스들은 Key값이 담긴 Set을 반환하는 keySet() 메서드를 사용해 순차적으로 접근한다.
대표적인 클래스들로 HashMap, LinkedHashMap, TreeMap이 있는데 이들은 HashSet, LinkedHashSet, TreeSet과 유사한 동작을 한다.
HashMap
기본적인 Map의 구현 클래스이며 hash를 사용하여 데이터를 저장한다.
hash를 사용하기 때문에 저장 순서를 보장하지 않는다. Object 클래스의 equals 메서드와 hashCode 메서드를 사용하여 Key의 동일 인스턴스 여부를 판단한다.
HashTable
HashMap과 동일한 특징을 가지지만 항상 동기화를 지원하므로 멀티 쓰레드에서는 안전하지만 단일 쓰레드에서도 동기화를 하기 때문에 HashMap에 비해 성능이 약간 느리다. 특별한 상황이 아니라면, HashMap을 사용하는 것이 권장된다.
LinkedHashMap
LnkedList와 HashMap이 결합된 형태로, 저장 순서를 보장한다.저장 순서를 보장하므로 저장된 순서대로 반복한다.
TreeMap
SortedMap의 구현 클래스로 Binary Tree 자료구조를 기반으로 인스턴스를 저장한다. 저장 순서가 유지되지 않지만 정렬된 상태가 유지되면서 인스턴스가 저장된다.
class Person implements Comparable<Person> {
private int age;
@Override
public int compareTo(Person p) {
return this.age - p.age;
}
}
Map<Person, Integer> tree = new TreeMap<>();
class PersonComparator implements Comparator<Person> {
@Override
public int compare(Person p1, Person p2) {
return p2.age - p1.age;
}
}
Map<Person> tree = new TreeMap<>(new PersonComparator());
정렬 기준으로 입력받은 클래스에 Comparable<T> 인터페이스의 compareTo 메서드를 구현하거나 Comparator<T> 인터페이스를 구현한 클래스를 TreeMap의 생성자의 인자로 넣어 정렬기준을 결정한다.
참조
윤성우의 열혈 JAVA 프로그래밍
https://st-lab.tistory.com/142
https://docs.oracle.com/javase/tutorial/collections/interfaces/index.html
https://memostack.tistory.com/234
https://readystory.tistory.com/144
https://soft.plusblog.co.kr/70