Java/컬렉션

[Java]HashMap 객체 생성 방법, HashMap 생성자(constructor)

DevStory 2022. 5. 2.

HashMap 객체 생성 방법

이번 포스팅은 Java에서 HashMap 객체를 생성하는 다양한 방법을 소개합니다.


생성자(constructor)

다음은 기본 생성자를 사용하여 HashMap 객체를 생성하는 방법입니다.


1. 기본 생성자

일반적으로 가장 많이 사용하는 방법입니다.

HashMap<String, String> hmap = new HashMap<String, String>();

이 생성자는 초기 용량을 16으로 설정하고 적재율이 0.75인 HashMap 객체를 생성합니다. 


2. 초기 용량 및 적재율 설정

다음은 HashMap 객체의 초기 용량과 적재율을 설정하는 생성자입니다.

// 초기 용량만 설정
public HashMap(int initialCapacity)

// 초기 용량, 적재율 둘 다 설정
public HashMap(int initialCapacity, float loadFactor)

 

생성자의 첫 번째 인수로 초기 용량을 전달합니다.

Map<String, String> hmap = new HashMap<String, String>(10);

 

다음은 초기 용량과 적재율 둘 다 설정합니다.

Map<String, String> hmap = new HashMap<String, String>(10, 0.5f);

3. 다른 HashMap 객체를 생성자에 전달

다른 HashMap 객체를 생성자에 전달하여 HashMap 객체를 생성할 수 있습니다. 

Map<String, String> hmOriginal = new HashMap<String, String>();

hmOriginal.put("key1", "One");
hmOriginal.put("key2", "Two");
hmOriginal.put("key3", "Three");

Map<String, String> hmapCopy = new HashMap(hmOriginal);

정적 초기화

static 코드 블록을 사용하여 HashMap 객체를 초기화할 수 있습니다. 이 방법은 HashMap 객체가 정적으로 동작하므로 필요한 항목을 추가 및 제거할 수 있습니다.

public static Map<String, String> hmStatic;
static {
    hmStatic = new HashMap<>();
    hmStatic.put("key1", "value1");
    hmStatic.put("key2", "value2");
}

컬렉션 사용

단일 요소로 구성된 불변 HashMap 객체를 생성해야 하는 경우 Collections.singletonMap() 메서드를 사용합니다.

Map<String, String> map = Collections.singletonMap("key1", "value1");

위 방법으로 생성된 HashMap 객체는 값을 변경하거나 항목을 추가할 수 없습니다. 다음과 항목을 추가하는 경우 UnsupportedOperationException이 발생합니다.

Map<String, String> map = Collections.singletonMap("key1", "value1");

map.put("key2", "value2");

 

변경할 수 없는 빈 HashMap 객체를 생성해야 하는 경우 Collections.emptyMap() 메서드를 사용합니다.

Map<String, String> emptyHmap = Collections.emptyMap();
반응형

스트림(Stream) 사용

다음은 Java 8의 Stream API를 사용하여 Map을 초기화하는 방법입니다.


1. Collectors.toMap() 메서드 사용

다음은 2차원 문자열 배열의 Stream을 Map 인스턴스로 수집합니다.

Map<String, String> map = Stream.of(new String[][] {
  { "Key1", "Value1" },
  { "Key2", "Value2" },
}).collect(Collectors.toMap(data -> data[0], data -> data[1]));

 

Map 클래스의 키는 유일한 값으로 다음 예제처럼 동일한 키를 추가하는 경우 Duplicate Key 에러가 발생합니다.

Map<String, String> map = Stream.of(new String[][] {
        { "Key1", "Value1" },
        { "Key2", "Value2" },
        { "Key2", "Value3" }
}).collect(Collectors.toMap(data -> data[0], data -> data[1]));

 

그리고 Key는 문자열(String)이고 Value는 정수형(Integer)인 경우 String 배열을 Object으로 변경합니다. 그리고 Collectors.toMap() 메서드에서 명시적으로 타입을 변환합니다.

Map<String, String> map = Stream.of(new Object[][] {
  { "Key1", 1 },
  { "Key2", 2 },
  { "Key3", 3 }
}).collect(Collectors.toMap(
  data -> (String) data[0], 
  data -> (Integer) data[1]
));

2. Map.Entry 사용

다음은 Map.Entry의 인스턴스를 사용하는 방법입니다. 다음은 SimpleEntry 스트림을 생성하고 값을 변경할 수 있으며 항목을 추가할 수 있는 Map을 반환합니다.

Map<String, Integer> map = Stream.of(
  new AbstractMap.SimpleEntry<>("key1", "value1"), 
  new AbstractMap.SimpleEntry<>("key2", "value2"))
  .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

3. 변경할 수 없는 Map 초기화

Value를 변경할 수 없으며, 항목을 추가할 수 없는 불변 Map 객체를 초기화해야 하는 경우가 있습니다. Collectors.collectingAndThen() 내부에 Collectors.toMap() 메서드를 호출하여 만들 수 있습니다.

Map<String, String> map = Stream.of(new String[][] { 
    { "Key1", "Value1" }, 
    { "Key2", "Value2" },
}).collect(Collectors.collectingAndThen(
    Collectors.toMap(data -> data[0], data -> data[1]), 
    Collections::<String, String> unmodifiableMap));

스트림 API를 사용하여 Map 객체를 생성하는 방법은 많은 가비지 객체가 생성되므로 오버헤드가 발생할 수 있습니다. 따라서 스트림을 사용하여 변경할 수 없는 Map 객체를 생성하는 방법은 최대한 피해야 합니다.

반응형

댓글