Java Collections.unmodifiableMap()根据map生成不可变map(springboot) 作者:马育民 • 2024-12-09 00:00 • 阅读:10004 # 介绍 返回 **不可修改** 的有序 map。只能从 map 中获取数据。 如果修改数据(无论是直接修改、通过其 collection 视图修改,还是通过其 subMap、 headMap或 tailMap视图修改),将抛出 `UnsupportedOperationException` 异常 如果指定的有序映射是可序列化的,则返回的有序映射也将是可序列化的。 ### 应用场景 保存配置文件数据,读取配置文件数据后,放入 map 中,通过该方法,返回 **不可变** 的 `Map`,防止有人修改 `Map`,导致配置文件的参数被篡改 如:springboot 读取 `Application.yaml` 文件后,就将数据放入 `Map` 中,然后通过 该方法 返回 **不可变** 的 `Map` 在 `YamlPropertySourceLoader` 类的 `58行` 左右使用 # 例子 ``` package go.jacob.day729; import java.util.Collections; import java.util.HashMap; import java.util.Map; public class Demo5 { public static void main(String[] args) { Map map=new HashMap(); map.put(1,new StringBuilder("c1")); map.put(2,new StringBuilder("c2")); map.put(3,new StringBuilder("c3")); Map unmodifiableMap=Collections.unmodifiableMap(map); //这时候如果再往unmodifiableMap中添加元素,会发生错误 unmodifiableMap.put(4,new StringBuilder("c4")); } } ``` 由于向 `unmodifiableMap` 添加数据,导致报错 ### 可以修改 value 的场景 但是,由于map中的value是 `StringBuilder` 类型,是 **可变对象**,所以依然可以对key进行修改。看如下代码: ``` package go.jacob.day729; import java.util.Collections; import java.util.HashMap; import java.util.Map; public class Demo5 { public static void main(String[] args) { Map map=new HashMap(); map.put(1,new StringBuilder("c1")); map.put(2,new StringBuilder("c2")); map.put(3,new StringBuilder("c3")); Map unmodifiableMap=Collections.unmodifiableMap(map); //这时候如果再往unmodifiableMap中添加元素,会发生错误 //unmodifiableMap.put(4,new StringBuilder("c4")); unmodifiableMap.get(3).append("new"); System.out.println(unmodifiableMap.get(3)); } } ``` ### 修改原map,会影响到unmodifiableMap 如果修改原map中的对象,会影响到unmodifiableMap ``` map.get(1).append("new"); System.out.println(unmodifiableMap.get(1)); ``` 参考: https://blog.csdn.net/zjkC050818/article/details/76325665 原文出处:http://malaoshi.top/show_1GWBgaXn96c.html