코딩 스쿨 Java

언어선택 : HTMLCSSJAVAJAVASCRIPTMYSQLSQL PHP

Java HashMap

자바 HashMap: 개념 및 사용법

  • *HashMap*은 자바에서 제공하는 맵(Map) 인터페이스의 구현체로, **키-값 쌍(key-value pair)**을 저장하는 데이터 구조입니다. **해시 테이블(Hash Table)**을 기반으로 하며, 빠른 데이터 검색, 삽입, 삭제가 가능하여 자주 사용되는 자료구조 중 하나입니다.

HashMap은 **키(key)**를 사용하여 고유하게 데이터를 식별하며, 각 키에 대응하는 값(value)을 저장합니다. 키는 중복될 수 없지만, 값은 중복될 수 있습니다. HashMapnull 키와 null 값을 허용합니다.

1. HashMap의 특징

  1. 키-값 쌍으로 데이터 저장: 각 요소는 고유한 키와 이에 대응하는 값을 가집니다.
  2. 빠른 데이터 접근: 내부적으로 해시 테이블을 사용하므로, 데이터 검색, 삽입, 삭제가 평균적으로 매우 빠릅니다.
  3. 순서를 유지하지 않음: HashMap은 삽입된 순서를 보장하지 않습니다. 순서가 중요한 경우 **LinkedHashMap*을 사용할 수 있습니다.
  4. 동기화되지 않음: 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. HashMapHashtable의 차이점

| 특징 | `

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. HashMapLinkedHashMap의 차이점

특징 HashMap LinkedHashMap
순서 보장 여부 삽입 순서를 유지하지 않음 삽입된 순서를 유지
성능 일반적으로 더 빠름 삽입 순서를 유지하는 추가 작업으로 인해 약간 느림

LinkedHashMapHashMap의 모든 기능을 가지면서도 삽입된 순서를 유지하는 특징이 있습니다.

7. HashMapTreeMap의 차이점

특징 HashMap TreeMap
순서 보장 여부 순서를 유지하지 않음 키를 정렬된 순서로 유지
성능 평균적으로 O(1) 삽입, 삭제, 조회 성능 O(log n) (정렬 때문)

TreeMap은 키를 자동으로 오름차순 정렬합니다. 데이터가 항상 정렬된 상태로 유지되어야 할 경우에는 TreeMap을 사용하는 것이 적합합니다.

요약

  • *HashMap*은 자바에서 키-값 쌍을 저장하고 검색하는 데 매우 효율적인 자료 구조입니다.
  • 키는 중복될 수 없지만, 값은 중복될 수 있으며, null 키와 null 값을 허용합니다.
  • 주요 메서드로는 put(), get(), remove(), containsKey(), containsValue(), size() 등이 있으며, 다양한 방식으로 데이터에 접근할 수 있습니다.
  • HashMap은 동기화되지 않으므로 멀티스레드 환경에서는 Collections.synchronizedMap()을 사용하여 동기화된 맵을 사용할 수 있습니다.
  • 순서가 중요한 경우 LinkedHashMap을, 정렬이 필요한 경우 TreeMap을 사용할 수 있습니다.

HashMap은 자바에서 가장 널리 사용되는 컬렉션 클래스 중 하나로, 데이터의 빠른 저장, 검색, 삭제를 필요로 하는 상황에서 매우 유용하게 사용할 수 있습니다.


copyright ⓒ 스타트코딩 all rights reserved.
이메일 : startcodingim@gamil.com