Java嵌套Map及示例

培训教学 潘老师 7个月前 (10-11) 203 ℃ (0) 扫码查看

1.介绍

HashMap类扩展了AbstractMap类并实现了Map接口。它保存条目对象,即键-值对。键或值的类型为Object。

嵌套HashMap是Map内部的Map。HashMap和嵌套HashMap之间唯一的区别是:

  • 对于HashMap,键或值可以是任何类型(对象)。
  • 对于嵌套HashMap,键可以是任何类型(对象),但值只能是另一个HashMap对象。

请注意下面创建的嵌套HashMap;我们创建一个HashMap,它以’String’为键,以另一个’HashMap’作为值,这就是我们称之为嵌套HashMap的情况。

// 创建嵌套的HashMap
Map<String, HashMap<Integer, String>> nestedMap = new HashMap<>();

2.何时使用嵌套Map?

我们使用嵌套Map时,通常是因为我们需要嵌套对象,即一个对象内部包含其他对象。让我们以JSON数据结构为例,其中我们在其他对象内部有嵌套对象。

{
  "Alex": {
    "Hideout": "UAE",
    "Permanent": "Florida",
    "Postal": "Canada"
  },
  "Brian": {
    "Hideout": "India",
    "Permanent": "Alaska",
    "Postal": "Canada"
  }
}

嵌套Map在代码可读性上很难扩展,并且Java中的Map往往会消耗大量内存。将Map填充更多Map只会加重内存消耗问题。因此,在使用嵌套Map时需要谨慎,应该仅在实际需要的特殊情况下使用。

3.使用嵌套HashMap

要创建嵌套Map,首先必须创建一个普通的HashMap,只是这个Map的值将是另一个HashMap。

3.1. 使用Map.put()创建嵌套Map

我们可以使用Map接口的put()方法来向外部和内部HashMap中添加元素。

Map<String, Map<String, String>> employeeMap = new HashMap<>();
Map<String, String> addressMap = new HashMap<>();
addressMap.put("Permanent", "Florida");
addressMap.put("Postal", "Canada");
employeeMap.put("Alex", addressMap);

3.2. 使用流创建嵌套Map

我们可以使用流API使用Collectors.toMap()方法创建嵌套Map。在以下示例中,我们创建了一个’学生’类,具有’studentId’和其他字段。

class Student
{
    private Integer studentId;
    private String studentName;
    private String course;
    // Getters & Setters
}

我们有一个学生对象的列表,从这个列表中,我们创建了一个嵌套Map,其中键为’studentId’,值为另一个以’studentName’为键和以’course’为值的Map。

// 创建嵌套Map
List<Student> studentList = List.of(
    new Student(1, "A", "Course1"),
    new Student(2, "B", "Course2"),
    new Student(3, "C", "Course3"));
Map<Integer, Map<String, String>> studentNestedMap =
    studentList.stream()
        .collect(Collectors.groupingBy(s -> s.getStudentId(),
            Collectors.toMap(Student::getStudentName, Student::getCourse)));

3.3. 向嵌套Map添加元素

我们可以通过首先从外部Map中检索内部Map,然后使用put()方法向内部Map添加新元素来向现有的嵌套Map中添加新元素。

Map<String, Map<String, String>> employeeMap = new HashMap<>();
//为Alex添加另一个地址
employeeMap.get("Alex").put("Hideout", "UAE");

3.4. 从嵌套Map中删除元素

要从嵌套HashMap中删除元素,类似于前面的示例,调用remove()方法。

Map<String, Map<String, String>> employeeMap = new HashMap<>();
//移除Alex的Hideout地址
employeeMap.get("Alex").remove("Hideout");

3.5. 遍历嵌套HashMap

我们可以像遍历普通HashMap一样遍历嵌套Map。

Map<String, Map<String, String>> employeeMap = new HashMap<>();
for (Map.Entry<String, Map<String, String>> empMap : employeeMap.entrySet()) {
  Map<String, String> addMap = empMap.getValue();
  //迭代内部map
  for (Map.Entry<String, String> addressSet : addMap.entrySet()) {
    System.out.println(addressSet.getKey() + " :: " + addressSet.getValue());
  }
}

4.结论

我们学习了嵌套Map以及如何创建它们,添加、删除和遍历元素。还看到了可以在哪些情况下使用嵌套Map。


版权声明:本站文章,如无说明,均为本站原创,转载请注明文章来源。如有侵权,请联系博主删除。
本文链接:https://www.panziye.com/teach/9447.html
喜欢 (0)
请潘老师喝杯Coffee吧!】
分享 (0)
用户头像
发表我的评论
取消评论
表情 贴图 签到 代码

Hi,您需要填写昵称和邮箱!

  • 昵称【必填】
  • 邮箱【必填】
  • 网址【可选】