章
目
录
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。