介绍
返回 不可修改 的有序 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<Integer,StringBuilder> map=new HashMap<Integer,StringBuilder>();
map.put(1,new StringBuilder("c1"));
map.put(2,new StringBuilder("c2"));
map.put(3,new StringBuilder("c3"));
Map<Integer,StringBuilder> 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<Integer,StringBuilder> map=new HashMap<Integer,StringBuilder>();
map.put(1,new StringBuilder("c1"));
map.put(2,new StringBuilder("c2"));
map.put(3,new StringBuilder("c3"));
Map<Integer,StringBuilder> 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