原创

Java中常量Map、常量List

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/catoop/article/details/68927742

Java 中声明常量我们一般使用 final 关键字来修饰,但是 final 一般只对基本数据类型有效,比如:

public static final String content = "你好";
public static final int num = 1;

如果我们需要一个常量的List或者Map,单纯的使用 final 来修饰,对添加和修改集合的内容就没有作用了。下面的代码并不能达到我们的目的“集合内容常量化”。

    public static final Map<String, String> myMap = new HashMap<String, String>() {
        private static final long serialVersionUID = 1L;

        {
            put("1", "11");
            put("2", "22");
        }
    };

    public static final List<String> myList = new ArrayList<String>() {
        private static final long serialVersionUID = 1L;

        {
            add("a");
            add("b");
        }
    };

具体原因有兴趣的可以去研究Java的内存地址存储,下面直接给出可以解决问题达到目的方法:

    public static final Map<String, String> myMap = Collections.unmodifiableMap(new HashMap<String, String>() {
        private static final long serialVersionUID = 1L;

        {
            put("1", "11");
            put("2", "22");
        }
    });

    public static final List<String> myList = Collections.unmodifiableList(new ArrayList<String>() {
        private static final long serialVersionUID = 1L;

        {
            add("a");
            add("b");
        }
    });

当然List 还有另外一种方法:

public static final List<String> myList1 = new ArrayList<String>(Arrays.asList("Tom", "Jerry", "Mike"));

最后多说一句,上面代码中的 final 虽然并不能对 Map、List 内容的修改起到实际作用,但是和String这种类型一样,可以禁止直接对map赋值。
被final修饰后,当我们的集合初始化以后,再进行直接对象赋值,像 myMap = new HashMap<String, String>(); 这样,是无法通过编译的。
所以为达目的,我们既要禁止对象通过“直接赋值”的方式来修改,也要禁止集合内容的变更。

正文到此结束
Loading...