博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[置顶] Guava学习之Immutable集合
阅读量:4886 次
发布时间:2019-06-11

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

中文意思就是不可变。那为什么需要构建一个不可变的对象?原因有以下几点:

  1. 在并发程序中,使用既保证线程安全性,也大大增强了并发时的效率(跟并发锁方式相比)。尤其当一个对象是值对象时,更应该考虑采用方式;
  2. 被不可信的类库使用时会很安全;
  3. 如果一个对象不需要支持修改操作(mutation),将会节省空间和时间的开销;经过分析,所有不可变的集合实现都比可变集合更加有效地利用内存;
  4. 可以当作一个常量来对待,并且这个对象在以后也不会被改变。

将一个对象复制一份成immutable的,是一个防御性编程技术。在JDK类库中很多集合(List、Set、Map等)都可以调用Collections类提供的静态方法unmodifiableXXX(…)来得到一个不可修改的视图,如下所示:

List list = new ArrayList();list.add("wyp");list.add("good");List unmodifiableList = Collections.unmodifiableList(list);System.out.println(unmodifiableList);//[wyp, good]unmodifiableList.add("add");

上述代码利用Collections.unmodifiableList(list)得到一个不可修改的集合unmodifiableList,当unmodifiableList.add(“add”)时,运行代码将会出现以下异常:

Exception in thread "main" java.lang.UnsupportedOperationException	at java.util.Collections$UnmodifiableCollection.add(Collections.java:1018)	at com.wyp.test.testFiles(test.java:152)	at com.wyp.test.main(test.java:160)

一切看起来很不错,因为调用unmodifiableList.add()会抛出一个java.lang.UnsupportedOperationException。但,如果有用户修改了list,会发生什么情况?在上述代码的下面加入以下代码:

list.add("add");System.out.println(unmodifiableList);

当你再次打印unmodifiableList的时候,你会发现结果是[wyp, good, add],多了一个add元素。unmodifiableList不是不可变的吗?这显然不是我们期望的。

说明:Collections.unmodifiableList(…)实现的不是真正的,当原始集合被修改后,里面的元素也是跟着发生变化。

利用JDK类库中提供的unmodifiableXXX方法最少存在以下几点不足:

  1. 笨拙:因为你每次都得写那么多代码;
  2. 不安全:如果没有引用到原来的集合,这种情况之下才会返回唯一真正永恒不变的集合;
  3. 效率很低:返回的不可修改的集合数据结构仍然具有可变集合的所有开销。

类库中提供的Immutable才是真正的不可修改的集合。

import com.google.common.collect.ImmutableList;ImmutableList immutableList = ImmutableList.of("wyp", "good");

当你往immutableList 中添加元素,也会抛出java.lang.UnsupportedOperationException异常。可以用ImmutableList提供的以下几个方法来得到一个不可变的集合:

copyOf(Collection<? extends E> elements)比如ImmutableList.copyOf(list);
用of()方法得到一个空的不可变的List(ImmutableList提供了很多of()的重写);
利用Builder来实现:

List list = new ArrayList();list.add("wyp");list.add("good");ImmutableList GOOGLE_IMMUTABLE = ImmutableList				. builder().addAll(list).add("add").build();

JDK和提供的不可变类型:

可变集合类型 JDK or Guava? Guava
Collection JDK ImmutableCollection
List JDK ImmutableList
Set JDK ImmutableSet
SortedSet/NavigableSet JDK ImmutableSortedSet
Map JDK ImmutableMap
SortedMap JDK ImmutableSortedMap
Multiset Guava ImmutableMultiset
SortedMultiset Guava ImmutableSortedMultiset
Multimap Guava ImmutableMultimap
ListMultimap Guava ImmutableListMultimap
SetMultimap Guava ImmutableSetMultimap
BiMap Guava ImmutableBiMap
ClassToInstanceMap Guava ImmutableClassToInstanceMap
Table Guava ImmutableTable
转载请注明: 转载自
本文链接地址: 

 

转载于:https://www.cnblogs.com/dyllove98/p/3186861.html

你可能感兴趣的文章
如何实现点击左右按钮换图片?
查看>>
Myeclipse 10使用hibernate生成注解(annotation)实体类
查看>>
Java操作SVN(实现文件的解锁、检出、更新及提交)---SVNKit学习示例
查看>>
Torch或Numpy
查看>>
吴裕雄 数据挖掘与分析案例实战(8)——Logistic回归分类模型
查看>>
编译libevent源代码(Windows)
查看>>
【 UVALive - 4287】Proving Equivalences (SCC缩点)
查看>>
【UVALive - 3487】 Duopoly(网络流-最小割)
查看>>
vue-条件渲染
查看>>
Spring依赖注入原理
查看>>
数组结构之数组
查看>>
堆栈方法区示意图
查看>>
Android抽屉(SlidingDrawer --类似android通知栏下拉效果)
查看>>
如何解决adb devices 端口被占用的问题zz
查看>>
android开发规范
查看>>
Web 前端攻防(2014版)
查看>>
冒泡排序法
查看>>
strtok源码 bitset 空间压缩
查看>>
The Alliance
查看>>
leetcode 刷题 数组类 Two Sum
查看>>