Java에서
HashMap은 키-값(key-value) 쌍을 저장하는 데 사용된다. 해시 테이블을 기반으로 하며, 데이터 검색, 삽입, 삭제가 가능하다.
- 키-값 쌍 저장: 각 키(key)에 하나의 값(value)을 매핑한다. 키는 고유해야 하지만 값은 중복될 수 있다.
- 해시 테이블 기반: 내부적으로 해시 테이블을 사용하여 데이터를 저장하므로, 평균적으로
O(1)의 시간 복잡도로 데이터에 접근할 수 있다. - 순서 없음: HashMap은 요소의 삽입 순서를 보장하지 않는다.
null키와 값 허용: 하나의null키와 여러 개의null값을 허용한다.- 동기화 되지 않음: 멀티 스레드 환경에서 사용할 경우 외부에서 동기화 처리를 해야 한다.
지정된 키와 값을 맵에 추가. 동일한 키가 이미 존재하면 기존 값을 새 값으로 대체.
HashMap<String, Integer> map = new HashMap<>();
map.put("apple", 1);
map.put("banana", 2);지정된 키에 매팽된 값을 반환. 키가 존재하지 않으면 null 반환.
int value = map.get("apple"); // value는 1지정된 키와 그 매핑된 값을 맵에서 제거.
map.remove("banana");맵에 지정된 키가 있나 확인.
boolean hasApple = map.containsKey("apple"); // true맵에 지정된 값이 있나 확인.
boolean hasValue1 = map.containsValue(1); // true맵에 저장된 키-값 쌍의 개수를 반환.
int size = map.size(); // 1맵에 저장된 모든 키를 Set으로 반환.
Set<String> keys = map.keySet();맵에 저장된 모든 값을 collection으로 반환.
Collection<Integer> values = map.values();맵에 저장된 모든 키-값 쌍을 Set으로 반환.
Set<Map.Entry<String, Integer>> entries = map.entrySet();HashMap은 내부적으로 버킷(bucket)배열을 사용하여 데이터를 저장한다. 각 키의 hashCode를 기반으로 버킷 인덱스를 계산하고, 해당 버킷에 키-값 쌍을 저장한다. 해시 충돌이 발생하면 동일한 버킷에 링크드 리스트나 트리 구조(Java 8 이후: 트리 구조)로 저장된다.
- 해시 코드 충돌: 키 객체는 hashCode와 equals 메서드를 적절히 오버라이드 해서 해시 코드 충돌을 최소화 해야 한다. 동일한 해시 코드를 가진 키는 동일한 버킷에 저장되므로 성능 저하 가능성이 있다.
- 동기화: 멀티스레드 환경에서 HashMap을 사용하는 경우, 동기화 되지 않은 상태로 인하여 데이터 무결성이 깨질 수 있다.