728x90
Java에서 데이터를 효율적으로 저장하고 빠르게 검색하기 위해 다양한 컬렉션 클래스가 제공됩니다.
그중에서도 HashMap은 키-값 쌍을 저장하고 관리하는 데 있어 매우 유용한 데이터 구조입니다.
이 글에서는 Java의 HashMap에 대해 알아보고, 사용 방법과 예제를 통해 그 장단점을 살펴보겠습니다.
HashMap이란❓
HashMap은 Map 인터페이스를 구현한 대표적인 Map 컬렉션입니다.
Map 인터페이스를 상속하고 있기 때문에 Map의 성질을 그대로 가지고 있습니다.
HashMap은 데이터를 저장할 때 키(Key)와 값(Value)이 짝을 이루어 저장됩니다.
이때 키와 값들은 모두 객체로, 값은 중복될 수 있지만 키는 중복될 수 없습니다❗
만약 키를 중복해서 저장한다면 기존에 있던 값은 없어지고 새로운 값으로 바뀌게 됩니다.
위 "HashMap"그림을 보면 알 수 있듯이 키와 값으로 저장할 위치를 선택하기 때문에, 사용자는 저장되는 위치를 알 수 없습니다.
HashMap 사용방법
HashMap 선언
기본
HashMap<String,String> map1 = new HashMap<String,String>();
HashMap<String, String> h2 = new HashMap<String, String>(20);
HashMap<String, String> h3 = new HashMap<String, String>(20, 0.8);
HashMap<String, String> h4 = new HashMap<String, String>(h1);
HashMap은 저장공간보다 값이 추가로 들어오면 List처럼 저장공간을 추가로 늘리는데 List처럼 저장공간을 한 칸씩 늘리지 않고 약 두배로 늘립니다. 따라서 과부하가 많이 발생합니다.
초기에 저장할 데이터 개수를 알고 있다면 Map의 초기 용량을 지정해 주는 것이 좋습니다.
- load factor 0.8 : 저장공간이 80% 채워져 있을 경우에 추가로 저장공간을 확보합니다.
capacity = bucket의 크기
한 HashMap 객체에 저장된 데이터의 수 = capacity * load_factor
HashMap 추가
HashMap<Integer,String> map = new HashMap<Integer,Integer>();
map.put(1, 1);
map.put(2, 2);
map.put(3, 3);
map.put(4, 4);
System.out.println(map); //결과 : {1=1, 2=2, 3=3, 4=4}
HashMap 삭제
HashMap<Integer,String> map = new HashMap<Integer,Integer>();
map.put(1, 1);
map.put(2, 2);
map.put(3, 3);
map.put(4, 4);
map.remove(1); //key : 1 제거
System.out.println(map); //결과 : {2=2, 3=3, 4=4}
map.clear(); // 모든 값 제거
System.out.println(map); //결과 : {}
HashMap 출력
HashMap<Integer,String> map = new HashMap<Integer,Integer>();
map.put(1, 1);
map.put(2, 2);
map.put(3, 3);
map.put(4, 4);
System.out.println(map); // 전체 출력 : {1=1, 2=2, 3=3, 4=4}
System.out.println(map.get(1)); // Key 값 3의 Value : {1=1}
for(Map.Entry<Integer,Integer> entry : map.entrySet()) {
System.out.println("Key :" + entry.getKey() + " Value :" + entry.getValue());
}
//Key :1 Value :1
//Key :2 Value :2
//Key :3 Value :3
//Key :4 Value :4
for (int i : map.keySet()) {
System.out.println("Key :" + i + " Value :" + map.get(i));
}
//Key :1 Value :1
//Key :2 Value :2
//Key :3 Value :3
//Key :4 Value :4
HashMap 크기 출력
HashMap<Integer,String> map = new HashMap<Integer,Integer>();
map.put(1, 1);
map.put(2, 2);
map.put(3, 3);
map.put(4, 4);
System.out.println(map.size()); // HashMap 크기 출력 : 4
HashMap 특정 키 포함 여부
HashMap<Integer,String> map = new HashMap<Integer,Integer>();
map.put(1, 1);
map.put(2, 2);
map.put(3, 3);
map.put(4, 4);
System.out.println(hm.containsKey(4)); // Key 값 4 포함 여부 : true
System.out.println(hm.containsKey(5)); // Key 값 5 포함 여부 : false
HashMap의 메서드
메서드 | 반환 타입 | 설 명 |
clear() | void | HashMap에 저장된 모든 객체를제거 |
clone() | Object | 현재 HashMap을 복제해서 반환 |
containsKey(Object key) | boolean | HashMap에 지정된 키(key)가 포함되어있는지 확인 |
containsValue(Object value) | boolean | HashMap에 지정된 값(value)가 포함되어 있는지 확인 |
entrySet() | Set | HashMap에 저장된 키와 값을 엔트리(키와 값의 결합)의 형태로 Set에 저장해서 반환 |
get(Object key) | Object | 지정된 키(key)의 값(value)를 반환. 못찾으면 null |
getOrDefault(Object key, Object defaultValue) | Object | 지정된 키(key)의 값(객체)를 반환하는데, 키를 못찾으면, 기본 값(defaultValue)로 지정된 객체를 반환 |
isEmpty | boolean | HashMap이 비어있는지 확인 |
keySet() | Set | HashMap에 저장된 모든 키가 저장된 Set을 반환 |
put(Object key, Object value) | Object | 지정된 키와 값을 HashMap에 저장 |
putAll(Map m) | void | Map에 저장된 모든 요소를 HashMap에 저장 |
remove(Object key) | Object | HashMap에서 지정된 키로 저장된 값(value)를 제거 |
replace(Object key, Object value) | Object | 지정된 키의 값을 지정된 객체(value)로 대체 |
replace(Object key, Object oldValue, Object newValue) | boolean | 지정된 키와 객체(oldValue)가 모두 일치하는 경우에만 새로운 객체(newValue)로 대체 |
size() | int | HashMap에 저장된 요소의 개수를 반환 |
values() | Collection | HashMap에 저장된 모든 값을 컬렉션의 형태로 반환. |
1) 데이터 추가
- V put(K key, V value) : key와 value를 추가합니다.
- void putAll(Map <? extends K,? extends V> m) : Map m의 데이터를 전부를 추가합니다.
- V putIfAbsent(K key, V value) : 기존 데이터에 key가 없으면 key와 value를 저장합니다.
2) 데이터 삭제
- void clear( ) : 모든 데이터를 삭제합니다.
- V remove(Object key) : key와 맞는 기존 데이터(key & value)를 삭제합니다.
- boolean remove(Object key, Object value) : (key & value)가 동시에 일치하는 데이터를 삭제합니다.
3) 데이터 수정
- V replace(K key, V value) : key와 일치하는 기존 데이터의 value를 변경합니다.
- V replace(K key, V oldValue, V newValue) : key와 oldValue가 동시에 일치하는 데이터의 value를 newValue로 변경합니다.
4) 데이터 확인
- boolean containsKey(Object key) : key와 일치하는 데이터가 있는지 여부를 반환합니다. (있으면 true)
- boolean containsValue(Object value) : value가 일치하는 데이터가 있는지 여부를 반환합니다. (있으면 true)
- boolean isEmpty( ) : 데이터가 빈 상태인지 여부를 반환합니다. (빈 상태면 true)
- int size( ) : key-value 맵핑 데이터의 개수를 반환합니다.
5) 데이터 반환
- V get(Object key) : key와 맵핑된 value값을 반환합니다.
- V getOrDefault(Object key, V defaultValue) : key와 맵핑된 value값을 반환하고 없으면 defaultValue값을 반환합니다.
- Set <Map.Entry <K, V>> entrySet( ) : 모든 key-value 맵핑 데이터를 가진 Set 데이터를 반환합니다.
- Set <K> keySet( ) : 모든 key 값을 가진 Set 데이터를 반환합니다.
- Collection <V> values( ) : 모든 value 값을 가진 Collection 데이터를 반환합니다.
HashMap 예제
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args) {
// HashMap 생성
HashMap<String, Integer> map = new HashMap<>();
// 데이터 추가
map.put("Apple", 1);
map.put("Banana", 2);
map.put("Cherry", 3);
// 데이터 검색
System.out.println("Apple의 값: " + map.get("Apple")); // 출력: Apple의 값: 1
// 데이터 삭제
map.remove("Banana");
// 데이터 존재 여부 확인
if (map.containsKey("Cherry")) {
System.out.println("Cherry 키가 존재합니다.");
}
if (map.containsValue(1)) {
System.out.println("값 1이 존재합니다.");
}
// 전체 데이터 출력
for (String key : map.keySet()) {
System.out.println(key + ": " + map.get(key));
}
}
}
실행 결과
Apple의 값 : 1
Cherry 키가 존재합니다.
값 1이 존재합니다.
Apple : 1
Cherry : 3
'자료구조' 카테고리의 다른 글
[자료구조 JAVA] LinkedHashSet 알아보기 (1/2) (0) | 2024.06.15 |
---|---|
[자료구조 JAVA] 스택 Stack 컬렉션 알아보기 (1/2) (0) | 2024.06.13 |
[JAVA] ArrayList 알아보기 (동적 배열) (0) | 2024.05.11 |
[자료구조] 스택 stack 알아보기 With JavaScript (0) | 2024.04.28 |
[자료구조] HashTable 알아보기 (JavaScript) (1) | 2024.04.21 |