자바 자료구조#08. Map의 특징

A Kind Dev·2023년 1월 30일
0

자바 자료구조

목록 보기
10/20

Map<K, V>

  • java.lang.Object (>) java.util.Dictionary<K, V> (>) java.util.Hashtable<K, V>
  • Hashtable은 Map Interface를 implements
  • Map Interface를 implements 하는 구현체 : Hashtable, HashMap
  • Hashtable은 동기화 지원, HashMap은 동기화 지원X
    멀티스레드일 때 == Thread-safe 해야 한다면 Hashtable
    But Hashtable은 병목현상이 발생할 가능성이 있음 => ConcurrentHashMap 사용 추천


Map 기본함수

  • HashTable 선언
Hashtable<String, Integer> map = new Hashtable<>();
  • 값 추가하기
map.put("A", 1);
map.put("B", 2);
  • 값 가져오기
map.get("key");
map.getOrDefault("key", "defaultValue"); // 해당하는 값이 없다면 기본값 반환
  • putIfAbsent (Key에 해당하는 Value가 없을 때만 값 추가)
map.put("A", 1);
map.put("A", 10); // A는 10으로 덮어쓰기

map.put("A", 1);
map.putIfAbsent("A", 10); // A는 계속 1
  • 값 제거
map.remove("key");
map.remove("B", 3); // key와 value가 모두 일치해야만 remove
  • replace
map.replace("A", 10);
map.replace("A", "oldVal", "newVal"); // key와 value가 일치해야만 새 값으로 덮어쓰기
  • 배열로 값만 가져오기
map.values();
  • 배열로 키만 가져오기
map.keySet();
  • 객체로 키 만들기
Map<MyData, Integer> map = new HashMap<>();
map.put(new MyData(1), 1);
map.put(new MyData(2), 2);
map.get(new MyData(1)); // 값을 못 찾아옴. Hash값이 다르기 때문

// Custom 객체를 Map의 Key로 사용하려면 hashCode() 값을 알아야 함 (객체에 hashCode 함수 Override)


Map의 모든 값 순회하기

entrySet 사용

map의 entrySet 을 사용하면 key, value 쌍의 목록을 얻을 수 있음

for (Map.Entry<String, Integer> entry : map.entrySet()) {
	System.out.println(entry.getKey() + ":" + entry.getValue());
}

keySet 사용

keySet을 사용해서 key의 목록을 얻고, 이를 통해 value를 얻어 사용

for (String key : map.keySet()) {
	System.out.println(key + ":" + map.get(key));
}

Iterator 사용

entrySet 이나 keySet 모두 Set 으로 제공되고 Collection에서 제공되는 Iterator를 사용 가능

Iterator<Map.Entry<String, Integer>> iter = map.entrySet().iterator();

while (iter.hasNext()) {
	var entry = iter.next(); // 타입추론
	System.out.println(entry.getKey() + ":" + entry.getValue());
}
profile
친절한 개발자

0개의 댓글