1. 개요
이 튜토리얼에서는 Java 에서 HashMap 을 초기화하는 다양한 방법에 대해 학습 합니다.
Java 8과 Java 9를 사용할 것입니다.
2. 정적 HashMap을 위한 정적 이니셜 라이저
정적 코드 블록을 사용하여 HashMap 을 초기화 할 수 있습니다 .
public static Map<String, String> articleMapOne;
static {
articleMapOne = new HashMap<>();
articleMapOne.put("ar01", "Intro to Map");
articleMapOne.put("ar02", "Some article");
}
이러한 종류의 초기화의 장점은 맵이 변경 가능하지만 정적에서만 작동한다는 것입니다. 따라서 필요한 경우 항목을 추가하고 제거 할 수 있습니다.
계속해서 테스트 해 보겠습니다.
@Test
public void givenStaticMap_whenUpdated_thenCorrect() {
MapInitializer.articleMapOne.put(
"NewArticle1", "Convert array to List");
assertEquals(
MapInitializer.articleMapOne.get("NewArticle1"),
"Convert array to List");
}
이중 중괄호 구문을 사용하여Map를 초기화 할 수도 있습니다.
Map<String, String> doubleBraceMap = new HashMap<String, String>() {{
put("key1", "value1");
put("key2", "value2");
}};
주의 는 모든 사용에 익명의 추가 클래스를 생성하기 때문에 우리는이 초기화 기법을 피하려고한다은 포함하는 객체에 대한 숨겨진 참조를 보유 하고 메모리 누수 문제가 발생할 수 있습니다.
3. 자바 컬렉션 사용
단일 항목으로 단일 불변 맵을 만들어야하는 경우 Collections.singletonMap () 이 매우 유용합니다.
public static Map<String, String> createSingletonMap() {
return Collections.singletonMap("username1", "password1");
}
여기에있는Map는 변경할 수 없으며 항목을 더 추가하려고하면 java.lang.UnsupportedOperationException이 발생합니다.
Collections.emptyMap () 을 사용하여 변경할 수없는 빈Map를 만들 수도 있습니다 .
Map<String, String> emptyMap = Collections.emptyMap();
4. 자바 8 방식
이 섹션에서는 Java 8 Stream API를 사용하여 맵을 초기화하는 방법을 살펴 보겠습니다 .
4.1. 사용 ) (Collectors.toMap를
2 차원 String 배열 의 Stream 을 사용하여 이를 맵으로 수집 해 보겠습니다.
Map<String, String> map = Stream.of(new String[][] {
{ "Hello", "World" },
{ "John", "Doe" },
}).collect(Collectors.toMap(data -> data[0], data -> data[1]));
여기서 키의 데이터 유형과 맵의 값이 동일합니다.
좀 더 일반적으로 만들기 위해 객체 배열을 가져와 동일한 작업을 수행합니다.
Map<String, Integer> map = Stream.of(new Object[][] {
{ "data1", 1 },
{ "data2", 2 },
}).collect(Collectors.toMap(data -> (String) data[0], data -> (Integer) data[1]));
결과적으로 키의 맵을 String으로 만들고 값을 Integer로 만듭니다.
4.2. Map.Entry 스트림 사용
여기서는 Map.Entry 의 인스턴스를 사용합니다 . 이것은 우리가 다른 키와 값 유형을 갖는 또 다른 접근 방식입니다.
먼저 Entry 인터페이스 의 SimpleEntry 구현을 사용 하겠습니다 .
Map<String, Integer> map = Stream.of(
new AbstractMap.SimpleEntry<>("idea", 1),
new AbstractMap.SimpleEntry<>("mobile", 2))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
이제 SimpleImmutableEntry 구현을 사용하여Map를 만들어 보겠습니다.
Map<String, Integer> map = Stream.of(
new AbstractMap.SimpleImmutableEntry<>("idea", 1),
new AbstractMap.SimpleImmutableEntry<>("mobile", 2))
.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
4.3. 불변Map 초기화
특정 사용 사례에서는 변경 불가능한 맵을 초기화해야합니다. Collectors.collectingAndThen () 내부에 Collectors.toMap () 을 래핑하여 수행 할 수 있습니다 .
Map<String, String> map = Stream.of(new String[][] {
{ "Hello", "World" },
{ "John", "Doe" },
}).collect(Collectors.collectingAndThen(
Collectors.toMap(data -> data[0], data -> data[1]),
Collections::<String, String> unmodifiableMap));
Streams를 사용한 이러한 초기화 는 엄청난 성능 오버 헤드를 유발하고 맵을 초기화하기 위해 많은 가비지 객체가 생성 될 수 있으므로 사용하지 않아야합니다 .
5. 자바 9 방식
Java 9는 변경 불가능한 맵의 생성 및 초기화를 단순화하는 Map 인터페이스 의 다양한 팩토리 메소드와 함께 제공 됩니다.
계속해서 이러한 팩토리 방법을 살펴 보겠습니다.
5.1. Map.of ()
이 팩토리 메소드는 인수, 단일 인수 및 가변 인수를 사용하지 않습니다.
Map<String, String> emptyMap = Map.of();
Map<String, String> singletonMap = Map.of("key1", "value");
Map<String, String> map = Map.of("key1","value1", "key2", "value2");
이 방법은 최대 10 개의 키-값 쌍만 지원합니다.
5.2. Map.ofEntries ()
Map.of () 와 유사 하지만 키-값 쌍의 수에는 제한이 없습니다.
Map<String, String> map = Map.ofEntries(
new AbstractMap.SimpleEntry<String, String>("name", "John"),
new AbstractMap.SimpleEntry<String, String>("city", "budapest"),
new AbstractMap.SimpleEntry<String, String>("zip", "000000"),
new AbstractMap.SimpleEntry<String, String>("home", "1231231231")
);
팩토리 메소드는 변경 불가능한 맵을 생성하므로 모든 변경으로 인해 UnsupportedOperationException이 발생합니다.
또한 null 키 또는 중복 키를 허용하지 않습니다.
이제 초기화 후 변경 가능하거나 성장하는 맵이 필요한 경우 Map 인터페이스 의 구현을 생성 하고 이러한 변경 불가능한 맵을 생성자에 전달할 수 있습니다.
Map<String, String> map = new HashMap<String, String> (
Map.of("key1","value1", "key2", "value2"));
Map<String, String> map2 = new HashMap<String, String> (
Map.ofEntries(
new AbstractMap.SimpleEntry<String, String>("name", "John"),
new AbstractMap.SimpleEntry<String, String>("city", "budapest")));
6. 구아바 사용
핵심 자바를 사용하는 방법을 살펴 보았으므로 계속해서 Guava 라이브러리를 사용하여Map를 초기화 해 보겠습니다.
Map<String, String> articles
= ImmutableMap.of("Title", "My New Article", "Title2", "Second Article");
이렇게하면 변경 불가능한 맵이 생성되고 변경 가능한 맵이 생성됩니다.
Map<String, String> articles
= Maps.newHashMap(ImmutableMap.of("Title", "My New Article", "Title2", "Second Article"));
ImmutableMap.of () 메서드 에는 최대 5 쌍의 키-값 매개 변수를 사용할 수있는 오버로드 된 버전도 있습니다. 다음은 두 쌍의 매개 변수가있는 예입니다.
ImmutableMap.of("key1", "value1", "key2", "value2");
7. 결론
이 글에서 우리는 Map 초기화의 다양한 방법 , 특히 빈, 싱글 톤, 불변 및 가변 맵을 생성 하는 방법을 탐구했습니다 . 보시다시피 Java 9 이후로이 분야가 크게 향상되었습니다.
항상 그렇듯이 샘플 소스 코드는 Github 프로젝트에 있습니다. Java 9 예제는 여기에 , Guava 샘플은 여기에 있습니다 .
- https://docs.spring.io/spring-framework/docs/current/reference/html
- https://www.baeldung.com/java-initialize-hashmap
'Java' 카테고리의 다른 글
Spring의 @Scheduled Annotation (0) | 2021.03.12 |
---|---|
Spring Boot의 유효성 검사(validation 예제) (0) | 2021.03.12 |
Spring @Value 사용방법(예제) (0) | 2021.03.12 |
스프링 부트 액추에이터 (0) | 2021.03.12 |
Java에서 문자열에 개행 문자(줄 바꿈) 추가 (0) | 2021.03.11 |