学习如何在Java中 使用嵌套哈希图 。 从创建、删除和迭代元素,我们还将看到我们可以使用嵌套地图的实际用例。
1.简介
HashMap 类扩展了AbstractMap类并实现了Map接口。它持有条目对象,即键值对。键和值都是对象类型。
嵌套的HashMap是Map中的Map。HashMap和嵌套HashMap的唯一区别是。
- 对于
HashMap,键或值可以是任何类型(对象)。 - 对于
Nested *HashMap*,键可以是任何类型(对象),但值只能是另一个HashMap 对象。
注意下面创建的嵌套哈希图;我们创建了一个以*'String'为键,以另一个'HashMap' 为值的哈希图,这就是我们所说的嵌套哈希图。
// Creating Nested HashMap
Map<String, HashMap<Integer, String>> nestedMap = new HashMap<>();
2.什么时候使用嵌套地图?
当我们需要嵌套对象时,我们就会使用嵌套地图,也就是对象中的对象。 让我们举一个JSON数据结构的例子,我们有嵌套在其他对象里面的对象。
{
"Alex": {
"Hideout": "UAE",
"Permanent": "Florida",
"Postal": "Canada"
},
"Brian": {
"Hideout": "India",
"Permanent": "Alaska",
"Postal": "Canada"
}
}
嵌套Maps很难扩展,使得代码难以阅读(代码可读性)。更重要的是,Java中的Maps往往会消耗大量的内存。用更多的Maps来填充一个Maps只会加剧内存消耗问题。所以我们在使用它的时候要小心,它将被用在真正需要它的特殊场景中。
3.使用嵌套哈希图
要创建一个嵌套地图,我们首先要创建一个普通的HashMap,只是这个地图的值将是另一个HashMap。
3.1.使用Map.put()创建嵌套地图
我们可以使用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.使用流创建嵌套地图
我们可以使用流api来创建嵌套地图,使用Collectors.toMap() 方法。在下面的例子中,我们正在创建一个'*Student'*类,其中有'studentId'和其他字段。
class Student
{
private Integer studentId;
private String studentName;
private String course;
// Getters & Setters
}
我们有一个学生对象的列表,从这个列表中,我们正在创建一个嵌套地图,其键为 'studentId',值为另一个地图,键为 studentName ,值为 course 。
// Creating Nested 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.向嵌套地图添加元素
我们可以向现有的嵌套地图添加新的元素,首先从外部地图中检索嵌套地图,然后使用put() 方法向内部地图添加新的元素。
Map<String, Map<String, String>> employeeMap = new HashMap<>();
//Adding another address for Alex
employeeMap.get("Alex").put("Hideout", "UAE");
3.4.从嵌套地图中删除元素
要从嵌套的HashMap中移除元素,调用remove() ,与前面的例子类似。
Map<String, Map<String, String>> employeeMap = new HashMap<>();
//Hideout has been exposed so removing it
employeeMap.get("Alex").remove("Hideout");
3.5.迭代嵌套哈希图
我们可以对嵌套图进行迭代,就像我们对普通HashMap进行迭代一样。
Map<String, Map<String, String>> employeeMap = new HashMap<>();
for (Map.Entry<String, Map<String, String>> empMap : employeeMap.entrySet()) {
Map<String, String> addMap = empMap.getValue();
// Iterate InnerMap
for (Map.Entry<String, String> addressSet : addMap.entrySet()) {
System.out.println(addressSet.getKey() + " :: " + addressSet.getValue());
}
}
4.总结
我们已经学习了嵌套图 以及如何创建它们并对元素进行添加、删除和迭代。我们还看到了我们可以在哪里使用嵌套图。