Java Collections.unmodifiableMap()根据map生成不可变map(springboot)

介绍

返回 不可修改 的有序 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


原文出处:/show_1GWBgaXn96c.html