博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编写一个初始化之后,不可修改的集合(比如:Map、List、Set等不可变对象)
阅读量:4220 次
发布时间:2019-05-26

本文共 1861 字,大约阅读时间需要 6 分钟。

Java中提供final关键字,对基本类型进行修饰,当第一次初始化后,该变量就不可被修改,比如:
private final int a = 123;
然而,对于Map等类型,我们只能对于其引用不能被再次初始化,而其中的值则可以变化,比如:
private static final Map
map = Maps.newHashMap();static { map.put(1, "one"); map.put(2, "two");}public static void main(String[] args) { map.put(1,"three"); log.info("{}", map.get(1));}
输出:
22:45:01.582 [main] INFO com.tim.concurrency.example.immutable.ImmutableExample -
three
分析上述代码可知map的值由原来key为1,value为one,被改为value为three。因此,此map是域不安全的。
改进方法(通过Collectionsf方法):
static {    map.put(1, "one");    map.put(2, "two");    map  = Collections.unmodifiableMap(map);}public static void main(String[] args) {    log.info("{}", map.get(1));}
分析:
上述map如果再被put,则会报异常,map.put(1, "three");则会报异常。
static {    map.put(1, "one");    map.put(2, "two");    map  = Collections.unmodifiableMap(map);}public static void main(String[] args) {    map.put(1, "three");    log.info("{}", map.get(1));}
上述代码会导致下面异常:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableMap.put(Collections.java:1457)
at com.tim.concurrency.example.immutable.ImmutableExample.main(ImmutableExample.java:27)
分析:上述map是域安全,被初始化之后,不能被修改了。
补充(利用Collections和Guava提供的类可实现的不可变对象):

Collections.unmodifiableXXX:Collection、List、Set、Map...

Guava:ImmutableXXX:Collection、List、Set、Map...

private final static ImmutableList
list = ImmutableList.of(1, 2, 3); // 这样被初始化之后 list是不能被改变 private final static ImmutableSet set = ImmutableSet.copyOf(list); // 这样被初始化之后set是不能被改变的 public static void main(String[] args) { list.add(123); set.add(222); }}

上述代码中的list和set不能再被改变。

注意:guava中的map的写法有点不一样如下:

private final static ImmutableMap
map = ImmutableMap.of(1,2,3,4,5, 6);private final static ImmutableMap
map2 = ImmutableMap.
builder().put(1,2).put(3,4).put(5,6).build();

转载地址:http://igomi.baihongyu.com/

你可能感兴趣的文章
C++内存分配秘籍—new,malloc,GlobalAlloc详解
查看>>
Code Review 代码审查 不完全整理
查看>>
结构体内存对齐详解
查看>>
关于C++兼容C,C++在linux程序设计API的调用等问题
查看>>
Linux下如何编译并运行C程序
查看>>
在linux下编译运行c语言程序
查看>>
C++/CLI,摘自百度的基本概念
查看>>
浅议C /CLI的gcnew关键字
查看>>
浅议C /CLI的gcnew关键字(2)
查看>>
CR, LF, CR/LF 回车 换行
查看>>
回车(CR)与换行(LF), '\r'和'\n'的区别
查看>>
对C标准中空白字符(空格、回车符(\r)、换行符(\n)、水平制表符(\t)、垂直制表符(\v)、换页符(\f))的理解
查看>>
ASCII码表_全_完整版
查看>>
DLL导出STL模板类和成员变量
查看>>
C++ STL 一般总结
查看>>
谷歌微软等科技巨头数据科学面试107道真题:你能答出多少?
查看>>
漫画赏析:Linux 内核到底长啥样
查看>>
Json解析的四种方法
查看>>
C/C++预编译头的概念
查看>>
C++程序员必读:让你的代码更强大
查看>>