Java/컬렉션

[Java]HashMap 초기화 방법

DevStory 2022. 8. 29.

HashMap 초기화 방법

이번 포스팅은 Java의 HashMap 객체를 초기화하는 몇 가지 방법을 소개합니다.


방법 1. null(권장하지 않음)

HashMap 객체를 null로 초기화할 수 있습니다.

 

null로 초기화하는 경우 HashMap 클래스에서 제공하는 메서드를 사용할 수 없습니다. null에서 메서드를 호출하는 것은 불가능하기 때문이죠. 따라서, null로 초기화하는 방법은 권장하지 않습니다.

 

다음 예제는 null로 초기화된 HashMap 객체에서 HashMap 클래스에서 제공하는 put() 메서드를 호출했을 때, NullPointerException이 발생하는 것을 보여줍니다.

public static void main(String args[]) {
  Map<String, Integer> hm = null;

  hm.put("둘리", 20);
}

[에러 내용]


방법 2. 기본 생성자 함수

기본 생성자 함수인 new HashMap()을 사용하여 HashMap 객체를 초기화할 수 있습니다.

 

다음 예제는 HashMap 객체를 기본 생성자 함수로 초기화하며, put() 메서드를 사용하여 데이터를 추가하고 콘솔에 데이터의 개수를 출력합니다.

public static void main(String args[]) {
  Map<String, Integer> hm = new HashMap<>();

  hm.put("둘리", 20);
  hm.put("또치", 30);
  hm.put("도우넛", 40);

  System.out.println("hm.size(): " + hm.size());
}

[실행 결과]

hm.size(): 3

방법 3. 데이터 할당

HashMap 객체를 초기화하면서 데이터를 할당할 수 있는 가장 심플한 방법은 이중 중괄호를 사용하는 방법입니다.

 

다음 예제는 이중 중괄호를 사용하여 HashMap 초기화 및 데이터 할당을 수행합니다.

public static void main(String args[]) {
  Map<String, Integer> hm = new HashMap(){{
    put("둘리", 10);
    put("또치", 20);
    put("마이콜", 30);
  }};

  System.out.println(hm);
}

[실행 결과]

{둘리=10, 마이콜=30, 또치=20}

방법 4. Stream API

Java 버전이 1.8 이상인 경우 Stream API를 사용하여 HashMap 객체를 초기화하면서 데이터를 할당할 수 있습니다.

 

배열과 Collectors.toMap()을 활용하는 방법과 AbstractMap.SimpleEntry를 활용하는 방법이 있습니다.

※ Java의 버전이 9 이상인 경우
Map.of() 메서드와 Map.ofEntries() 메서드를 사용하여 HashMap 객체를 초기화하면서 데이터를 할당할 수 있습니다. Stream을 사용하는 방법보다 코드를 간략하게 작성할 수 있습니다.

예제 1. 배열과 Collectors.toMap()

이차원 배열을 스트림으로 변환 후 Map으로 변환할 수 있습니다. Key의 타입과 Value의 타입이 동일한 경우 해당 타입을 배열의 타입으로 설정할 수 있습니다.

 

다음 예제는 Key와 Value의 타입이 String인 HashMap을 String 타입인 이차원 배열과 스트림을 사용하여 초기화합니다.

public static void main(String args[]) {
  Map<String, String> hm = Stream.of(new String[][] {
        {"둘리", "공룡"},
        {"또치", "새"},
        {"마이콜", "사람"}
  }).collect(Collectors.toMap(item -> item[0], item -> item[1]));

  System.out.println(hm);
}

[실행 결과]

{마이콜=사람, 둘리=공룡, 또치=새}

다음 예제는 Key의 타입이 String이고 Value의 타입이 Integer인 HashMap을 Object 타입인 이차원 배열과 스트림을 사용하여 초기화합니다.

public static void main(String args[]) {
  Map<String, Integer> hm = Stream.of(new Object[][] {
        {"둘리", 10},
        {"또치", 20},
        {"마이콜", 30}
  }).collect(Collectors.toMap(item -> (String)item[0], item -> (Integer)item[1]));

  System.out.println(hm);
}

[실행 결과]

{마이콜=30, 둘리=10, 또치=20}

예제 2. AbstractMap.SimpleEntry

또 다른 방법으로 SimpleEntry를 구현하여 HashMap을 초기화할 수 있습니다.

 

이 방법은 HashMap을 초기화하는 좋은 방법은 아니며, 예상치 못한 오류가 발생할 수 있습니다.

 

따라서, '이러한 방법이 있구나'라고 참고만 하시길 바랍니다.

public static void main(String args[]) {
  Map<String, Integer> hm = Stream.of(
        new AbstractMap.SimpleEntry<>("둘리", 10),
        new AbstractMap.SimpleEntry<>("또치", 20),
        new AbstractMap.SimpleEntry<>("마이콜", 30))
        .collect(Collectors.toMap(
                AbstractMap.SimpleEntry::getKey,
                AbstractMap.SimpleEntry::getValue));

  System.out.println(hm);
}

[실행 결과]

{마이콜=30, 둘리=10, 또치=20}

 

반응형

댓글