키 Key
와 값 Value
으로 구성되어 있으며, 키와 값은 모두 객체이다. 키는 중복 저장을 허용하지 않고(Set 방식), 값은 중복 저장이 가능(List 방식)하다.
Key가 중복되는 경우, 기존 Key에 해당하는 Value를 덮어 씌움
구현 클래스로 HashMap, Hashtable, LinkedHahsMap, TreeMap이 있음
Map 주요 메서드
객체 추가 메서드 | 기능 |
---|---|
V put(K key, V value) | 주어진 키와 값을 추가, 저장이 되면 값을 리턴 |
객체 검색 메서드 | 기능 |
---|---|
boolean containsKey(Object key) | 주어진 키가 저장되어 있는지 검색 |
boolean containsValue(Object value) | 주어진 값이 저장되어 있는지 검색 |
Set<Map.Entry<K, V>> entry() | 키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 set에 담아서 리턴 |
V get(Object Key) | 주어진 Key의 Value를 리턴 |
boolean isEmpty() | 컬렉션이 비어있는지 검사 |
Set(K) keySet | 모든 Key를 Set 객체에 담아서 리턴\ |
int size() | 저장되어 있는 Key의 수 반환 |
Collection<V> value(); | 저장된 모든 값을 Collection에 담아서 리턴 |
객체 삭제 메서드 | 기능 |
---|---|
void clear() | 저장된 모든 Map.Entry를 삭제 |
Value remove(Object Key) | 주어진 Key와 일치하는 Map.Enty 삭제 |
keySet() 메서드로 Set 컬렉션으로 변경 후 전체 객체 대상으로 한 번씩 반복해서 가져오는 반복자(Iterator)를 통해 객체 접근
HashMap
Map
인터페이스를 구현한 대표 Map
컬렉션, 키는 중복 저장을 허용하지 않으며, 값은 중복 값은 허용함. 동일한 키가 될 조건은 hashCode()
의 리턴값이 같고 .equals()
의 결과가 true이어야 함.
Hashtable
키 객체 만드는 법은 HashMap
과 동일하나 Hashtable은 스레드 동기화가 된 상태이기 때문에, 복수의 스레드가 동시에 Hashtable에 접근해 객체를 추가, 삭제 하더라도 스레드에 안전 (Thread safe)
HashMap 예제 ( Hashtable 과 사용법 동일 )
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class TestHashMap {
public static void main(String[] args) {
Map<String, Integer> hashMap = new HashMap<String, Integer>();
// Key, Value 삽입 - Key는 중복 불가
hashMap.put("사과", 1500);
hashMap.put("사과", 2500);
hashMap.put("망고", 2500);
hashMap.put("바나나", 3000);
hashMap.put("수박", 8000);
hashMap.put("메론", 5000);
// 입력 순서와 관계 없이 Key=Value 형식으로 출력됨
System.out.println(hashMap);
// {망고=2500, 수박=8000, 사과=2500, 메론=5000, 바나나=3000}
// Key를 이용하여 삭제
hashMap.remove("사과");
// 각각의 Key, Value가 포함되어잇는지 검사
System.out.println(hashMap.containsKey("망고"));
System.out.println(hashMap.containsValue(2500));
// KeySet 으로 변환 후 Iterator를 통해 접근
Iterator<String> iterator = hashMap.keySet().iterator();
// 모든 Key를 Set Collection으로 변환 > Set 으로 변환 후 Set 에서 iterator를 호출
// 일반 for 문과 iterator 를 이용한 출력
for (int i = 0; i < hashMap.size(); i++) {
String key = iterator.next();
System.out.println(key + "의 가격 : " + hashMap.get(key));
}
// 향상된 for 문을 사용하여 출력
for (String key : hashMap.keySet()) {
System.out.println(key + "의 가격 : " + hashMap.get(key));
}
// 전체 삭제 삭재
hashMap.clear();
System.out.println("isEmpty ? " + hashMap.isEmpty());
}
}
LinkedHashMap
은 put을 통해 입력된 순서대로 Key가 보장된다.
사용법은 HashMap
과 동일하다.
import java.util.Map;
import java.util.HashMap;
import java.util.LinkedHashMap;
public class TestLinkedHahsMap {
public static void main(String[] args) {
Map<String, Integer> hashMap = new HashMap<String, Integer>();
Map<String, Integer> linkedHashMap = new LinkedHashMap<String, Integer>();
hashMap.put("아이스크림", 2000);
hashMap.put("초콜릿", 2500);
hashMap.put("과자", 1500);
hashMap.put("음료슈", 2000);
hashMap.put("커피", 3000);
linkedHashMap.put("아이스크림", 2000);
linkedHashMap.put("초콜릿", 2500);
linkedHashMap.put("과자", 1500);
linkedHashMap.put("음료슈", 2000);
linkedHashMap.put("커피", 3000);
System.out.println(hashMap); // {초콜릿=2500, 과자=1500, 커피=3000, 아이스크림=2000, 음료슈=2000}
System.out.println(linkedHashMap); // {아이스크림=2000, 초콜릿=2500, 과자=1500, 음료슈=2000, 커피=3000}
}
}