JAVA공부

HashMap

ideas0123 2024. 11. 10. 01:42

HashMap은 Java에서 제공하는 가장 대표적인 맵(Map) 자료구조 중 하나로, **키-값 쌍(Key-Value pairs)**으로 데이터를 저장합니다. 각 키는 유일하며, 키를 통해 특정 값을 빠르게 조회하거나 업데이트할 수 있습니다. HashMap은 보통 데이터 검색이나 수정이 자주 필요할 때 매우 효율적으로 사용됩니다.

HashMap의 주요 특징

  1. Key-Value Pair
    • HashMap은 키와 값 쌍으로 데이터를 저장합니다. 각 키는 고유하며, 하나의 키에 여러 값을 저장할 수 없습니다. 동일한 키로 값을 추가하면, 기존의 값이 덮어씌워집니다.
    • 예를 들어, "apple"이라는 키와 5라는 값을 저장하려면 hashMap.put("apple", 5);처럼 추가할 수 있습니다.
  2. 해시 함수(Hash Function)
    • HashMap은 해시 함수를 사용해 키를 해시 코드로 변환한 후, 해당 해시 코드를 바탕으로 내부 배열에서 값을 저장할 위치를 결정합니다. 해시 함수를 통해 키의 위치를 결정하기 때문에 **검색 속도가 매우 빠르며, 평균 시간 복잡도가 O(1)**입니다.
  3. 충돌 관리(Collision Handling)
    • 두 개의 다른 키가 동일한 해시 코드로 변환될 때를 충돌이라고 합니다. HashMap은 충돌을 처리하기 위해 주로 체이닝(Chaining) 방식을 사용하며, 같은 해시 코드가 발생한 경우 연결 리스트로 키-값 쌍을 저장합니다.
  4. 순서 없음 (Unordered Collection)
    • HashMap은 키-값 쌍을 저장할 때 순서를 보장하지 않습니다. 데이터가 입력된 순서대로 출력되지 않습니다. 순서를 유지하려면 LinkedHashMap을 사용할 수 있습니다.
  5. Null 허용
    • HashMap은 null 키와 null 값을 허용합니다. null 키는 하나만 존재할 수 있지만, null 값은 여러 개가 가능합니다.

주요 메서드

  • put(K key, V value): 키-값 쌍을 추가하거나 업데이트합니다.
  • get(Object key): 키를 통해 값을 검색합니다. 키가 존재하지 않으면 null을 반환합니다.
  • containsKey(Object key): 키가 존재하는지 여부를 확인합니다.
  • containsValue(Object value): 값이 존재하는지 여부를 확인합니다.
  • remove(Object key): 특정 키를 제거하고, 제거된 키의 값을 반환합니다.
  • size(): HashMap에 있는 키-값 쌍의 개수를 반환합니다.

HashMap 사용 예제

import java.util.HashMap;

public class HashMapExample {
   public static void main(String[] args) {

   // HashMap 생성
   HashMap<String, Integer> hashMap = new HashMap<>();

   // 데이터 추가
   hashMap.put("apple", 3);
   hashMap.put("banana", 2);
   hashMap.put("orange", 5);

   // 데이터 조회
   System.out.println("apple의 수량: " + hashMap.get("apple")); // 3 출력

   // 데이터 수정
   hashMap.put("apple", 4); // apple의 값이 4로 업데이트
   System.out.println("업데이트 후 apple의 수량: " + hashMap.get("apple")); // 4 출력

   // 키 존재 여부 확인
   System.out.println("키 'banana'가 존재하는가? " + hashMap.containsKey("banana"));  // true 출력

   // 값 존재 여부 확인
   System.out.println("값 5가 존재하는가? " + hashMap.containsValue(5));  // true 출력

   // 데이터 삭제
   hashMap.remove("orange");
   System.out.println("orange 삭제 후: " + hashMap);  // {apple=4, banana=2} 출력

   // HashMap 크기 확인
   System.out.println("HashMap 크기: " + hashMap.size());  // 2 출력
   }
}

장점과 단점

장점:

  • 데이터 검색, 삽입, 삭제의 평균 시간이 O(1)로 매우 빠릅니다.
  • 키를 통해 값을 빠르게 접근할 수 있습니다.

단점:

  • 순서를 보장하지 않습니다.
  • 많은 충돌이 발생하면 성능이 저하될 수 있습니다.
  • HashMap은 동기화되지 않아 멀티스레드 환경에서 사용할 때 주의가 필요합니다.

HashMap의 활용 예

HashMap은 데이터가 키를 통해 고유하게 구분될 때 매우 유용합니다. 예를 들어, 사용자 이름을 키로 하고 사용자 ID를 값으로 저장하거나, 제품 이름을 키로 하고 재고 수량을 값으로 저장하는 경우에 활용됩니다.