转自:https://blog.csdn.net/michaellufhl/article/details/6314333

大家都知道JDK提供了Collections.UnmodifiableList(),Collections.UnmodifiableSet()和Collections.unmodifiableMap()这些包装方法。事实上它们的实现都是包装了原来的集合对象,然后在add,put,remove这样的方法上面抛出UnsupportedOperationException。这样就实现了Unmodifiable特性。这种做法在编程中叫作转发(forwarding)。

这样的Unmodifiable集合能满足一般的需求,但是如果碰到下面的情况 - 例如你需要定义2个常数放在List里面然后把这个List做成final,而且用Collections.UnmodifiableList()包装一下,就以为高枕无忧了:

  1. List<String> l = new ArrayList<String>();
  2. l.add("FULL");
  3. l.add("LOW");
  4. final List<String> unmodifiableList = Collections.unmodifiableList(l);  //返回指定列表的不可修改视图。Exception in thread "main" java.lang.UnsupportedOperationException

看上去unmodifiableList是不可改变的,但是如果这样:

  1. l.add("NORMAL");

你再看unmodifiableList已经被加了"NORMAL"。

当然有经验的程序员可以把原来的List放到新作的List然后Unmodifiable包装一下:

  1. List<String> unmodifiableList= Collections.unmodifiableList(new ArrayList(l));

但是已经有Google Collection的Immutable集合解决了这个问题。刚才unmodifiableList可以这样来做:

  1. ImmutableList<String> unmodifiableList = ImmutableList.copyOf(l);

除此之外Immutable集合还提供了ImmutableSet和ImmutableMap来包装集合。

为了便捷开发Immutable集合还能让开发者方便地在初始化设值:

值得注意的是这些Immutable集合都是abstract类,它们的初始化都是由of(),copyOf()以及builder模式这样方式来实现。这也体现了作者在编程时候对代码灵活度的考虑。

下载地址: google guava

Immutable集合的更多相关文章

  1. [置顶] Guava学习之Immutable集合

    Immutable中文意思就是不可变.那为什么需要构建一个不可变的对象?原因有以下几点: 在并发程序中,使用Immutable既保证线程安全性,也大大增强了并发时的效率(跟并发锁方式相比).尤其当一个 ...

  2. MUTABLE和IMMUTABLE集合

    Scala 集合类系统地区分了可变的和不可变的集合.可变集合可以在适当的地方被更新或扩展.这意味着你可以修改,添加,移除一个集合的元素.而不可变集合类,相比之下,永远不会改变.不过,你仍然可以模拟添加 ...

  3. Guava学习笔记:Immutable(不可变)集合

    不可变集合,顾名思义就是说集合是不可被修改的.集合的数据项是在创建的时候提供,并且在整个生命周期中都不可改变. 为什么要用immutable对象?immutable对象有以下的优点: 1.对不可靠的客 ...

  4. Immutable(不可变)集合

    Immutable(不可变)集合 不可变集合,顾名思义就是说集合是不可被修改的.集合的数据项是在创建的时候提供,并且在整个生命周期中都不可改变. 为什么要用immutable对象?immutable对 ...

  5. java代码之美(4)---guava之Immutable(不可变)集合

    Immutable(不可变)集合 一.概述 guava是google的一个库,弥补了java语言的很多方面的不足,很多在java8中已有实现,暂时不展开.Collections是jdk提供的一个工具类 ...

  6. .Net中的不可变集合(Immutable Collection)简介

    今天发现MS在Nuget上发布了一个Immutable Collection的程序集,提供了对不可变对象的集合的支持. 简单的看了一下,貌似支持的还比较全: ImmutableArray<T&g ...

  7. java代码(4)---guava之Immutable(不可变)集合

    Immutable(不可变)集合   一,概述 guava是google的一个库,弥补了java语音的很多方面的不足,很多在java8中已有实现,暂时不展开,Collections是jdk提供的一个工 ...

  8. Guava集合--Immutable(不可变)集合

    所谓不可变集合,顾名思义就是定义了之后不可修改的集合. 一.为什么要使用不可变集合 不可变对象有很多优点,包括: 当对象被不可信的库调用时,不可变形式是安全的: 不可变对象被多个线程调用时,不存在竞态 ...

  9. guava学习--集合2&Range

    转载:http://www.cnblogs.com/peida/p/Guava_ImmutableCollections.html Table: 当我们需要多个索引的数据结构的时候,通常情况下,我们只 ...

随机推荐

  1. [html]点击button后画面被刷新原因:未设置type="button"

    一.问题原因解析: 在form表单里的button, type 属性未设置的情况下,Internet Explorer 的默认类型是 "button",而其他浏览器中(包括 W3C ...

  2. C#异常信息获取

    try { ; / i; } catch (Exception ex) { /** * 1.异常消息 * 2.异常模块名称 * 3.异常方法名称 * 4.异常行号 */ String str = &q ...

  3. Oracle11g温习-第三章:instance实例管理

    2013年4月27日 星期六 10:30 1.instance 功能:   用于管理和访问database. 2.init parameter files :管理实例相关启动参数.位置:$ORACLE ...

  4. Hibernate---介绍

    Hibernate---介绍 框架体系结构: 2hibernate入门 1.1 ORM框架 Hibernate是一个数据持久化层的ORM框架. Object:对象,java对象,此处特指JavaBea ...

  5. CNN autoencoder 进行异常检测——TODO,使用keras进行测试

    https://sefiks.com/2018/03/23/convolutional-autoencoder-clustering-images-with-neural-networks/ http ...

  6. vnc xfce tab自动补全失效的解决方法

    edit~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml find the line <proper ...

  7. javascript---不可靠的“undefined”

    undefined 在 JavaScript 中,假设我们想判断一个是否是 undefined,那么我们通常会这样写: if(a === undefined){//code} 但是,JavaScrip ...

  8. SVM学习(五):松弛变量与惩罚因子

    https://blog.csdn.net/qll125596718/article/details/6910921 1.松弛变量 现在我们已经把一个本来线性不可分的文本分类问题,通过映射到高维空间而 ...

  9. 关于apicloud ios自定义模块引用第三方framework not found for architecture armv7

    1 .自定义模块 新建模块必须是静态库 2.使用的第三方framework 必须要把 .h文件开放出来 3.编译要用 真机模式 (上传模块以后,自定义load要编译,用生成的二维码调试) 4. 添加监 ...

  10. property 的详细使用方法

    property(fget=None, fset=None, fdel=None, doc=None)  俗话说条条大路通罗马,同样是完成一件事,Python 其实提供了好几个方式供你选择. prop ...