首页 课程 师资 教程 报名

在Java中进行HashMap初始化

  • 2022-11-11 10:06:37
  • 789次 星辉

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

我们将使用 Java 8 和 Java 9。

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

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

使用 Java 集合

如果我们需要创建带有单个条目的单例不可变映射,Collections.singletonMap() 将变得非常有用:

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

请注意,这里的映射是不可变的,如果我们尝试添加更多条目,它会抛出java.lang.UnsupportedOperationException。

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

Map<String, String> emptyMap = Collections.emptyMap();

Java 8 方式

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

1.使用 Collectors.toMap()

让我们使用一个二维字符串数组的Stream并将它们收集到一个地图中:

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

注意这里Map的 key 和 value 的数据类型是相同的。

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

 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。

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<String, Integer> map = Stream.of(
  new AbstractMap.SimpleImmutableEntry<>("idea", 1),    
  new AbstractMap.SimpleImmutableEntry<>("mobile", 2))
  .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

3.初始化不可变映射

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

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));

对象来初始化映射。

Java 9 方式

Java 9 在Map接口中带有各种工厂方法 ,可简化不可变映射的创建和初始化。

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

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 个键值对。

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。

此外,它们不允许空键或重复键。

现在,如果我们在初始化后需要一个可变或不断增长的映射,我们可以创建 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")));

使用Guava

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

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 对键值参数。以下是具有 2 对参数的示例:

ImmutableMap.of("key1", "value1", "key2", "value2");

以上就是关于“在Java中进行HashMap初始化”的介绍,大家如果想了解更多相关知识,不妨来关注一下本站的Java HashMap的基本操作,相信对大家的学习一定会有所帮助的。

选你想看

你适合学Java吗?4大专业测评方法

代码逻辑 吸收能力 技术学习能力 综合素质

先测评确定适合在学习

在线申请免费测试名额
价值1998元实验班免费学
姓名
手机
提交