Java HashMap
자바 HashMap
: 개념 및 사용법
- *
HashMap
*은 자바에서 제공하는 맵(Map) 인터페이스의 구현체로, **키-값 쌍(key-value pair)**을 저장하는 데이터 구조입니다. **해시 테이블(Hash Table)**을 기반으로 하며, 빠른 데이터 검색, 삽입, 삭제가 가능하여 자주 사용되는 자료구조 중 하나입니다.
HashMap
은 **키(key)**를 사용하여 고유하게 데이터를 식별하며, 각 키에 대응하는 값(value)을 저장합니다. 키는 중복될 수 없지만, 값은 중복될 수
있습니다. HashMap
은 null
키와 null
값을 허용합니다.
1. HashMap
의 특징
- 키-값 쌍으로 데이터 저장: 각 요소는 고유한 키와 이에 대응하는 값을 가집니다.
- 빠른 데이터 접근: 내부적으로 해시 테이블을 사용하므로, 데이터 검색, 삽입, 삭제가 평균적으로 매우 빠릅니다.
- 순서를 유지하지 않음:
HashMap
은 삽입된 순서를 보장하지 않습니다. 순서가 중요한 경우 **LinkedHashMap
*을 사용할 수 있습니다. - 동기화되지 않음:
HashMap
은 기본적으로 동기화되지 않으며, 멀티스레드 환경에서 사용하려면 동기화를 추가해야 합니다.
2. HashMap
선언 및 생성
HashMap
은 **제네릭(Generic)**을 사용하여 키와 값의 타입을 지정할 수 있습니다. HashMap
을 사용하려면 먼저 **
.util.HashMap
**을 임포트해야 합니다.선언 및 생성 예제
import java.util.HashMap; public class Main { public static void main(String[] args) { // String을 키로 하고 Integer를 값으로 갖는 HashMap 생성 HashMap<String, Integer> map = new HashMap<>(); // Integer를 키로 하고 String을 값으로 갖는 HashMap 생성 HashMap<Integer, String> map2 = new HashMap<>(); } }
위 예제에서는
String
타입의 키와Integer
타입의 값을 가지는HashMap
을 생성했습니다. 제네릭을 사용하여 저장할 데이터의 타입을 지정할 수 있습니다.3.
HashMap
주요 메서드
HashMap
은 키-값 쌍을 저장, 조회, 삭제하는 다양한 메서드를 제공합니다. 주요 메서드는 다음과 같습니다.3.1
put()
- 요소 추가
put()
메서드는HashMap
에 키-값 쌍을 추가하는 데 사용됩니다. 동일한 키가 이미 존재할 경우, 기존 값이 새로운 값으로 덮어씌워집니다.import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); // 요소 추가 map.put("Apple", 10); map.put("Banana", 15); map.put("Orange", 20); // 출력 System.out.println(map); // 출력: {Apple=10, Banana=15, Orange=20} } }
3.2
get()
- 값 가져오기
get()
메서드는 지정된 키에 해당하는 값을 반환합니다. 키가 존재하지 않으면null
을 반환합니다.import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("Apple", 10); map.put("Banana", 15); // 키를 사용해 값 가져오기 Integer value = map.get("Banana"); System.out.println(value); // 출력: 15 } }
3.3
containsKey()
- 키 존재 여부 확인
containsKey()
메서드는HashMap
에 특정 키가 존재하는지 여부를 확인합니다.import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("Apple", 10); // 키 존재 여부 확인 System.out.println(map.containsKey("Apple")); // 출력: true System.out.println(map.containsKey("Banana")); // 출력: false } }
3.4
containsValue()
- 값 존재 여부 확인
containsValue()
메서드는HashMap
에 특정 값이 존재하는지 여부를 확인합니다.import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("Apple", 10); map.put("Banana", 15); // 값 존재 여부 확인 System.out.println(map.containsValue(10)); // 출력: true System.out.println(map.containsValue(5)); // 출력: false } }
3.5
remove()
- 요소 삭제
remove()
메서드는HashMap
에서 특정 키에 해당하는 키-값 쌍을 삭제합니다.import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("Apple", 10); map.put("Banana", 15); // 요소 삭제 map.remove("Banana"); System.out.println(map); // 출력: {Apple=10} } }
3.6
size()
- 맵의 크기 확인
size()
메서드는HashMap
에 저장된 키-값 쌍의 개수를 반환합니다.import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("Apple", 10); map.put("Banana", 15); // 맵의 크기 확인 System.out.println(map.size()); // 출력: 2 } }
3.7
isEmpty()
- 맵이 비어 있는지 확인
isEmpty()
메서드는HashMap
이 비어 있는지 여부를 확인합니다.import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); // 맵이 비어 있는지 확인 System.out.println(map.isEmpty()); // 출력: true map.put("Apple", 10); System.out.println(map.isEmpty()); // 출력: false } }
3.8
clear()
- 모든 요소 삭제
clear()
메서드는HashMap
에 저장된 모든 키-값 쌍을 삭제합니다.import java.util.HashMap; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("Apple", 10); map.put("Banana", 15); // 모든 요소 삭제 map.clear(); System.out.println(map); // 출력: {} } }
4.
HashMap
의 순회
HashMap
을 순회할 때는keySet()
메서드나entrySet()
메서드를 사용할 수 있습니다.keySet()
은 키들의 집합(Set)을 반환하고,entrySet()
은 각 키-값 쌍(Entry)의 집합을 반환합니다.4.1
keySet()
을 사용한 순회import java.util.HashMap; import java.util.Set; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("Apple", 10); map.put("Banana", 15); map.put("Orange", 20); // keySet()을 사용하여 키 순회 for (String key : map.keySet()) { System.out.println("Key: " + key + ", Value: " + map.get(key)); } } }
4.2
entrySet()
을 사용한 순회import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<>(); map.put("Apple", 10); map.put("Banana", 15); map.put("Orange", 20); // entrySet()을 사용하여 키-값 쌍 순회 for (Map.Entry<String, Integer> entry : map.entrySet()) { System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue()); } } }
출력 예시:
Key: Apple, Value: 10 Key: Banana, Value: 15 Key: Orange, Value: 20
5.
HashMap
과Hashtable
의 차이점| 특징 | `
HashMap
|
Hashtable| |-------------------|------------------------------------------------|--------------------------------------------------| | **동기화** | 동기화되지 않음 (멀티스레드에서 안전하지 않음) | 동기화됨 (멀티스레드에서 안전함) | | **
null허용 여부** |
null키와 값을 허용 |
null` 키와 값을 허용하지 않음 | | 성능 | 더 빠름 | 동기화로 인해 더 느림 |
HashMap
은 기본적으로 동기화되지 않기 때문에, 멀티스레드 환경에서 사용할 경우Collections.synchronizedMap()
을 통해 동기화된 맵으로 감싸야 합니다.import java.util.Collections; import java.util.HashMap; import java.util.Map; public class Main { public static void main(String[] args) { Map<String, Integer> synchronizedMap = Collections.synchronizedMap(new HashMap<>()); synchronizedMap.put("Apple", 10); synchronizedMap.put("Banana", 15); System.out.println(synchronizedMap); } }
6.
HashMap
과LinkedHashMap
의 차이점
특징 | HashMap |
LinkedHashMap |
---|---|---|
순서 보장 여부 | 삽입 순서를 유지하지 않음 | 삽입된 순서를 유지 |
성능 | 일반적으로 더 빠름 | 삽입 순서를 유지하는 추가 작업으로 인해 약간 느림 |
LinkedHashMap
은 HashMap
의 모든 기능을 가지면서도 삽입된 순서를 유지하는 특징이 있습니다.
7. HashMap
과 TreeMap
의 차이점
특징 | HashMap |
TreeMap |
---|---|---|
순서 보장 여부 | 순서를 유지하지 않음 | 키를 정렬된 순서로 유지 |
성능 | 평균적으로 O(1) | 삽입, 삭제, 조회 성능 O(log n) (정렬 때문) |
TreeMap
은 키를 자동으로 오름차순 정렬합니다. 데이터가 항상 정렬된 상태로 유지되어야 할 경우에는 TreeMap
을 사용하는 것이
적합합니다.
요약
- *
HashMap
*은 자바에서 키-값 쌍을 저장하고 검색하는 데 매우 효율적인 자료 구조입니다. - 키는 중복될 수 없지만, 값은 중복될 수 있으며,
null
키와null
값을 허용합니다. - 주요 메서드로는
put()
,get()
,remove()
,containsKey()
,containsValue()
,size()
등이 있으며, 다양한 방식으로 데이터에 접근할 수 있습니다. HashMap
은 동기화되지 않으므로 멀티스레드 환경에서는Collections.synchronizedMap()
을 사용하여 동기화된 맵을 사용할 수 있습니다.- 순서가 중요한 경우
LinkedHashMap
을, 정렬이 필요한 경우TreeMap
을 사용할 수 있습니다.
HashMap
은 자바에서 가장 널리 사용되는 컬렉션 클래스 중 하나로, 데이터의 빠른 저장, 검색, 삭제를 필요로 하는 상황에서 매우 유용하게 사용할 수 있습니다.