[java] 맵 Map
참고
Java tutorial : Collections-Interfaces-The Map Interface
맵 Map
Map
은 key
와 value
를 쌍으로 저장하는 자료구조로 요소의 저장 순서를 유지하지 않고 키는 중복을 허용하지 않지만, 값의 중복은 허용한다.
Map
인터페이스에는 HashMap
, TreeMap
, LinkedHashMap
의 3개의 구현체가 있다.
- 기본 작업 (예 :
put, get, remove, containsKey, containsValue, size, empty
) - 대량 작업 (예 :
putAll, clear
) - 컬렉션 뷰 (예 :
keySet, entrySet
)
HashMap<K,V>
HashMap
클래스는 가장 많이 사용되는 클래스이고 해시 알고리즘을 사용해서 검색 속도가 매우 빠르다.
맵 생성
HashMap<키 데이터 타입, 값 데이터 타입> 맵 변수명 = new HashMap<키 데이터 타입, 값 데이터 타입>();
HashMap<String, String> hm1 = new HashMap<String, String>();
데이터 추가
.put()
메서드로 키와 값을 세팅할 수 있다. 또 다른 맵을 인수로 받으면 통째로 넣을 수 있다.
V put(K key, V value)
void putAll(Map<? extends K, ? extends V> m)
HashMap<String, String> hm1 = new HashMap<String, String>();
hm1.put("나이", "2");
hm1.put("종류", "웰시코기");
hm1.put("색상", "얼룩");
HashMap<String, String> hm2 = new HashMap<String, String>();
logger.debug("{}", hm2); // {}
hm2.put("이름", "박땡땡");
hm2.put("이름", "박땡"); // 같은 키의 다른 값을 넣으면 나중에 넣은 값으로 엎어진다.
hm2.putAll(hm1);
logger.debug("{}", hm2); // {색상=얼룩, 이름=박땡, 나이=2, 종류=웰시코기} // 순서가 유지 되지 않는 걸 확인할 수 있다.
데이터 가져오기
.get()
메서드에 키를 인수로 넘기면 값을 리턴한다. .getOrDefault()
메서드를 이용하여 맵 내에 없는 키로 데이터를 요청하면 같이 인수로 넘김 defaultValue
를 리턴한다. .getOrDefault()
메서드는 자바 8 이상부터 사용가능하다.
V get(Object key)
V getOrDefault(Object key, V defaultValue)
Assert.assertEquals("웰시코기", hm2.get("종류"));
Assert.assertEquals("모름", hm2.getOrDefault("부모", "모름"));
데이터 삭제
.remove()
메서드로 데이터 삭제가 가능하다.
V remove(Object key)
boolean remove(Object key, Object value)
hm2.remove("색상");
boolean b = hm2.remove("나이", 3); // 키, 값을 항께 인수로 넘기면 둘 다 맞아야만 삭제 가능
logger.debug("{} : {}", hm2, b); // {이름=박땡, 나이=2, 종류=웰시코기} : false
키, 값 확인
.containsKey()
와 .containsValue()
메서드로 맵에 인수로 들어온 키나 값이 포함되어 있는지 확인 후 true/false
를 리턴한다.
boolean containsKey(Object key)
boolean containsValue(Object value)
Assert.assertFalse(hm2.containsKey("색상"));
Assert.assertTrue(hm2.containsKey("이름"));
Assert.assertFalse(hm2.containsValue("색상"));
Assert.assertTrue(hm2.containsValue("웰시코기"));
데이터 크기
.size()
메서드로 키-값 쌍의 개수를 리턴한다.
int size()
Assert.assertEquals(3, hm2.size());
데이터 존재 여부
.isEmpty()
메서드로 맵이 비었는지 여부를 알 수 있다.
boolean isEmpty()
Assert.assertFalse(hm2.isEmpty());
TreeMap<K,V>
TreeMap
클래스는 데이터를 이진 검색 트리(binary search tree
)의 형태로 저장하는데 덕분에 데이터를 추가하거나 제거하는 등의 기본 동작 시간이 매우 빠르다.
JDK 1.2
부터 제공된 TreeMap
클래스는 NavigableMap
인터페이스를 기존의 이진 검색 트리의 성능을 향상시킨 레드-블랙 트리(Red-Black tree
)로 구현한다.
LinkedHashMap<K,V>
TODO