[Collection Framework] Map<K, V>
by mignon25
Map 인터페이스
키(key)와 값(value)을 하나의 쌍으로 묶어서 저장하는 컬렉션 클래스를 구현하는데 사용
- 키는 중복 불가, 값은 중복 허용
- 구현 클래스 : Hashtable, HashMap, LinkedHashMap, SortedMap, TreeMap 등
Map 인터페이스의 메서드
| 기능 | 리턴 타입 | 메서드(매개변수) | 설명 |
| 추가 | Object | put(Object key, Object value) | 주어진 키로 값 저장. 해당 키가 새로운 키일 경우 null 리턴, 동일한 키가 있을 경우 기존 값을 대체하고 대체되기 이전 값을 리턴. |
| void | putAll(Map t) | Map t의 모든 key-value 쌍을 추가 | |
| 검색 | boolean | containsKey(Object key) | 주어진 키가 있으면 true, 없으면 false 리턴 |
| boolean | containsValue(Object value) | 주어진 값이 있으면 true, 없으면 false 리턴 | |
| Set | entrySet() | 키와 값의 쌍으로 구성된 Map.Entry 객체를 Set에 담아서 리턴 | |
| Set | keySet() | 모든 키를 Set에 담아서 리턴 | |
| Object | get(Object key) | 주어진 키에 해당하는 값 리턴 | |
| Collection | values() | 저장된 모든 값을 Collection에 담아서 리턴 | |
| boolean | isEmpty() | 컬렉션이 비어있는지 확인 | |
| int | size() | 저장된 Entry 객체의 총 갯수 리턴 | |
| 삭제 | void | clear() | 모든 Map.Entry(키와 값) 삭제 |
| Object | remove(Object key) | 주어진 키와 일치하는 Map.Entry를 삭제하고 값 리턴 |
value()가 반환하는 값인 value는 중복이 허용되기 때문에 Set 타입이 아닌 Collection타입으로 반환되고, key를 반환하는 keySet()과 Map.Entry 객체를 반환하는 entrySet()은 중복된 값이 있을 수가 없으므로 Set 타입으로 반환된다.
Map.Entry 인터페이스와 메서드
Map 인터페이스의 내부 인터페이스.
Map에 저장되는 key-value 쌍을 다루기 위해 내부적으로 Entry 인터페이스를 정의
| 리턴 타입 | 메서드(매개변수) | 설명 |
| boolean | equals(Object o) | 동일한 Entry인지 비교한다. |
| Object | getKey() | Entry의 key 객체를 반환한다. |
| Object | getValue() | Entry의 value 객체를 반환한다. |
| Object | setValue(Object value) | Entry의 value 객체를 지정된 객체로 바꾼다. |
| int | hashCode() | Entry의 해시코드를 반환한다. |
HashMap 클래스의 생성자와 메서드
(Map, Map.Entry 인터페이스를 구현한 것은 제외)
| 리턴 타입 | 생성자/메서드(매개변수) | 설명 |
| (생성자) | HashMap() | HashMap 객체 생성 |
| HashMap(int initialCapacity) | 지정된 값을 초기용량으로 하는 HashMap 생성 | |
| HashMap(int initialCapacity, float loadFactor) | 지정된 초기용량과 load factor의 HashMap 생성 | |
| HashMap(Map m) | 지정된 Map의 모든 요소를 포함하는 HashMap 생성 | |
| Object | clone() | 현재 HashMap을 복제해서 반환 |
| Object | getOrDefault(Object key, Object defaultValue) | 지정된 키(key)의 값(객체)을 반환. 키를 못찾으면 기본값(defaultValue)로 지정된 객체를 반환 (테스트해봤는데 HashMap에 Entry를 추가하는 것은 아님) |
| Object | replace(Object key, Object value) | 지정된 키의 값을 지정한 객체(value)로 대체 |
| boolean | replace(Object key, Object oldValue, Object newValue) | 지정된 키와 객체(oldValue)가 모두 일치하는 경우에만 새로운 객체(newValue)로 대체 |
HashMap 사용 예시
import java.util.*;
public class HashMap1 {
public static void main(String[] args) {
// HashMap 생성
HashMap<String, Integer> map = new HashMap<>();
// Entry 객체 저장
map.put("피카츄", 85);
map.put("꼬부기", 95);
map.put("야도란", 75);
map.put("파이리", 65);
map.put("피존투", 15);
// 저장된 총 Entry 수 얻기
System.out.println("총 Entry 수: " + map.size());
// 객체 찾기
System.out.println("파이리 : " + map.get("파이리"));
// key 를 요소로 가지는 Set 을 생성 -> 순회하기 위해 필요
Set<String> keySet = map.keySet();
// KeySet 을 순회하는 Iterator
Iterator<String> keyIterator = keySet.iterator();
while(keyIterator.hasNext()) {
String key = keyIterator.next();
Integer value = map.get(key);
System.out.println(key + " : " + value);
}
// 객체 삭제
map.remove("피존투");
System.out.println("삭제 후 총 Entry 수 : " + map.size());
// Entry 객체를 요소로 가지는 Set 생성 -> 순회하기 위해 필요
Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
// Entry 객체를 순회하는 Iterator => entrySet 을 순회하면서 value 를 읽어옵니다.
Iterator<Map.Entry<String, Integer>> entryIterator = entrySet.iterator();
System.out.println("=== Map.Entry Iterator로 순회 ===");
while(entryIterator.hasNext()) {
Map.Entry<String, Integer> entry = entryIterator.next();
String key = entry.getKey(); // Map.Entry 인터페이스의 메서드
Integer value = entry.getValue(); // Map.Entry 인터페이스의 메서드
System.out.println(key + " : " + value);
}
// 객체 전체 삭제
// map.clear();
// getOrDefault() 테스트
System.out.println("총 Entry 수 : " + map.size()); // 4
int entryTest1 = map.getOrDefault("미뇽", 2525);
System.out.println("entryTest: " + entryTest1);
System.out.println("총 Entry 수 : " + map.size()); // 4
}
}
HashMap 예제 2
HashMap으로 전화번호부 만들어 출력하기
package CollectionFramework.HashMap;
import java.util.*;
public class HashMap2 {
HashMap<String, HashMap<String, String>> phoneBook = new HashMap<>();
// 그룹을 추가하는 메서드
// 그룹은 key : 그룹명, value : HashMap 으로 되어 있는 HashMap
void addGroup(String groupName) {
if(!phoneBook.containsKey(groupName)) {
phoneBook.put(groupName, new HashMap<>());
}
}
// 그룹에 전화번호를 추가하는 메서드
// 그룹의 value에 해당하는 HashMap : < String(전화번호), String(이름) >
void addPhoneNo(String groupName, String name, String tel) {
addGroup(groupName);
HashMap<String, String> group = phoneBook.get(groupName);
group.put(tel, name); // 이름은 중복일 수 있으니 전화번호를 key 로 저장
}
// 그룹 이름을 지정하지 않았을 때 그룹 추가 오버로딩 메서드
void addPhoneNo(String name, String tel) {
addPhoneNo("기타", name, tel);
}
// 전화번호부 전체를 출력하는 메서드
void printList() {
// 그룹은 key : 그룹명, value : HashMap 으로 되어 있는 HashMap
// value의 HashMap : < String(전화번호), String(이름) >
Set<Map.Entry<String, HashMap<String, String>>> set = phoneBook.entrySet();
Iterator<Map.Entry<String, HashMap<String, String>>> it = set.iterator();
while(it.hasNext()) {
Map.Entry<String, HashMap<String, String>> entry = it.next();
Set<Map.Entry<String, String>> subSet = entry.getValue().entrySet();
Iterator<Map.Entry<String, String>> subIt = subSet.iterator();
System.out.println(" * " + entry.getKey() + "[" + subSet.size() + "]");
while(subIt.hasNext()) {
Map.Entry<String, String> subEntry = subIt.next();
String name = subEntry.getValue();
String tel = subEntry.getKey();
System.out.println(name + " " + tel);
}
}
}
public static void main(String[] args) {
HashMap2 hm = new HashMap2();
hm.addPhoneNo("친구", "이자바", "010-1111-1111");
hm.addPhoneNo("친구", "김자바", "010-2222-2222");
hm.addPhoneNo("친구", "송자바", "010-3333-3333");
hm.addPhoneNo("친구", "정자바", "010-4444-4444");
hm.addPhoneNo("회사", "박대리", "010-5555-5555");
hm.addPhoneNo("회사", "박대리", "010-6666-6666");
hm.addPhoneNo("회사", "이과장", "010-7777-7777");
hm.addPhoneNo("세탁", "010-8888-8888");
hm.printList();;
}
}
// 출력 결과
* 기타[1]
세탁 010-8888-8888
* 친구[4]
이자바 010-1111-1111
정자바 010-4444-4444
송자바 010-3333-3333
김자바 010-2222-2222
* 회사[3]
이과장 010-7777-7777
박대리 010-6666-6666
박대리 010-5555-5555'Java' 카테고리의 다른 글
| [Collection FrameWork] ArrayList, LinkedList (0) | 2023.03.08 |
|---|---|
| [Collection FrameWork] Collection, List, Iterator (Methods) (0) | 2023.03.07 |
| 열거형 (Enum) (0) | 2023.03.06 |
| DI(Dependency Injection) 맛보기 (0) | 2023.03.03 |
| 제어자 - static, final, abstract (0) | 2023.02.28 |
블로그의 정보
Mignon'S Dev Log
mignon25