Java初始化HashMap 您所在的位置:网站首页 hashmap创建时初始化 Java初始化HashMap

Java初始化HashMap

2023-08-15 03:58| 来源: 网络整理| 查看: 265

Java初始化HashMap 1. 概述

在本教程中,我们将学习在Java中初始化HashMap的 各种方法 。

2. 静态HashMap的静态初始化器

我们可以使用静态代码块初始化 HashMap :

public static Map 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 doubleBraceMap = new HashMap() {{ put("key1", "value1"); put("key2", "value2"); }};

请注意,我们必须避免使用这种初始化技术,因为它在每次使用时都会创建一个匿名的额外类,保留对封闭对象的隐藏引用,并可能导致内存泄漏问题。

3. 使用Java集合

如果我们需要使用一个条目创建一个单例不可变地图,Collections.singletonMap() 会非常有用:

public static Map createSingletonMap() { return Collections.singletonMap("username1", "password1"); }

请注意,这里的地图是不可变的,并且如果我们尝试添加更多条目,它将抛出java.lang.UnsupportedOperationException。

我们还可以使用Collections.emptyMap()创建一个不变的空地图 :

Map emptyMap = Collections.emptyMap(); 4. Java 8方式

在本节中,让我们研究使用Java 8 Stream API初始化地图的方法。

4.1. 使用 Collectors.toMap()

让我们使用二维String数组的Stream并将它们收集到地图中:

Map map = Stream.of(new String[][] { { "Hello", "World" }, { "John", "Doe" }, }).collect(Collectors.toMap(data -> data[0], data -> data[1]));

请注意这里的键和值的数据类型地图是一样的。

为了使其更通用,让我们采用Objects 数组并执行相同的操作:

Map 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 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 = Stream.of( new AbstractMap.SimpleImmutableEntry("idea", 1), new AbstractMap.SimpleImmutableEntry("mobile", 2)) .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); 4.3. 初始化不可变地图

在某些用例中,我们需要初始化一个不变的地图。这可以通过包装来完成Collectors.toMap()内Collectors.collectingAndThen() :

Map map = Stream.of(new String[][] { { "Hello", "World" }, { "John", "Doe" }, }).collect(Collectors.collectingAndThen( Collectors.toMap(data -> data[0], data -> data[1]), Collections:: unmodifiableMap));

请注意,我们应避免使用Streams进行此类初始化, 因为这可能会导致巨大的性能开销,并且会创建大量垃圾对象来初始化地图。

5. Java 9方式

Java 9在Map界面中带有各种工厂方法,这些方法 简化了不可变地图的创建和初始化。

让我们继续研究这些工厂方法。

5.1. Map.of()

此工厂方法不带参数,单个参数和变量参数:

Map emptyMap = Map.of(); Map singletonMap = Map.of("key1", "value"); Map map = Map.of("key1","value1", "key2", "value2");

请注意,此方法最多仅支持10个键值对。

5.2. Map.ofEntries()

它类似于 Map.of(), 但对键值对的数量没有限制:

Map map = Map.ofEntries( new AbstractMap.SimpleEntry("name", "John"), new AbstractMap.SimpleEntry("city", "budapest"), new AbstractMap.SimpleEntry("zip", "000000"), new AbstractMap.SimpleEntry("home", "1231231231") );

请注意,工厂方法会生成不可变的映射,因此任何突变都将导致 UnsupportedOperationException。

而且,它们不允许空键或重复键。

现在,如果在初始化后需要可变的或正在增长的地图,则可以创建Map接口的任何实现, 并将这些不可变的地图传递给构造函数:

Map map = new HashMap ( Map.of("key1","value1", "key2", "value2")); Map map2 = new HashMap ( Map.ofEntries( new AbstractMap.SimpleEntry("name", "John"), new AbstractMap.SimpleEntry("city", "budapest"))); 6. 使用Guava库

当我们研究了使用核心Java的方式时,让我们继续使用Guava库初始化地图:

Map articles = ImmutableMap.of("Title", "My New Article", "Title2", "Second Article");

这将创建一个不变的地图,并创建一个可变的地图:

Map 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以来,该领域有了巨大的进步。

原文链接:https://blog.csdn.net/allway2/article/details/113750986



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有