例子

  1. public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of(
  2. "red",
  3. "orange",
  4. "yellow",
  5. "green",
  6. "blue",
  7. "purple");
  8. class Foo {
  9. Set<Bar> bars;
  10. Foo(Set<Bar> bars) {
  11. this.bars = ImmutableSet.copyOf(bars); // defensive copy!
  12. }
  13. }

为啥? 
不可变对象拥有众多好处:

  • Safe for use by untrusted libraries.
  • Thread-safe: can be used by many threads with no risk of race conditions.
  • Doesn't need to support mutation, and can make time and space savings with that assumption. All immutable collection implementations are more memory-efficient than their mutable siblings (analysis)
  • Can be used as a constant, with the expectation that it will remain fixed

防止可变对象拷贝是一个良好的编程习惯,请看这儿:http://www.javapractices.com/topic/TopicAction.do?Id=15 

Making immutable copies of objects is a good defensive programming technique. Guava provides simple, easy-to-use immutable versions of each standard Collection type, including Guava's own Collection variations. 
接下来,Guava说居然JDK的Colletions提供了一套Collections.unmodifiableXXX方法,但不太好用,因此Guava不是在重复造轮子。又强调说,如果你不希望对一个集合进行update,那么最好采用防御性拷贝方式,将它们拷贝到一个不可变的集合中。Guava的集合实现都不支持null的元素(Guva通过研究,发现95%的情况不需要使用null的集合元素),所以如果需要null集合元素,就不能用Guava了。 
咋整? 
可使用如下方法创建不可变集合:

  • using the copyOf method, for example, ImmutableSet.copyOf(set)
  • using the of method, for example, ImmutableSet.of("a", "b", "c") or ImmutableMap.of("a", 1, "b", 2)
  • using a Builder, 看示例:
  1. public static final ImmutableSet<Color> GOOGLE_COLORS =
  2. ImmutableSet.<Color>builder()
  3. .addAll(WEBSAFE_COLORS)
  4. .add(new Color(0, 191, 255))
  5. .build();

使用copeOf(0

  1. ImmutableSet<String> foobar = ImmutableSet.of("foo", "bar", "baz");
  2. thingamajig(foobar);
  3. void thingamajig(Collection<String> collection) {
  4. ImmutableList<String> defensiveCopy = ImmutableList.copyOf(collection);
  5. ...
  6. }

asList 
All immutable collections provide an ImmutableList view via asList(), so -- for example -- even if you have data stored as an ImmutableSortedSet, you can get the kth smallest element with sortedSet.asList().get(k). 

通过asList构造的List通常比直接new ArrayList要快,毕竟它是指定大小的。 

在哪?

Interface JDK or Guava? Immutable Version
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

创建集合 
简化集合创建 
原来多麻烦:

  1. Map<String, Integer> counts = new HashMap<String, Integer>();
  2. for (String word : words) {
  3. Integer count = counts.get(word);
  4. if (count == null) {
  5. counts.put(word, 1);
  6. } else {
  7. counts.put(word, count + 1);
  8. }
  9. }

现在:

  1. Multiset<String> wordsMultiset = HashMultiset.create();
  2. wordsMultiset.addAll(words);

Table 
Java代码  

  1. Table<Vertex, Vertex, Double> weightedGraph = HashBasedTable.create();
  2. weightedGraph.put(v1, v2, 4);
  3. weightedGraph.put(v1, v3, 20);
  4. weightedGraph.put(v2, v3, 5);
  5. weightedGraph.row(v1); // returns a Map mapping v2 to 4, v3 to 20
  6. weightedGraph.column(v3); // returns a Map mapping v1 to 20, v2 to 5

工具类

Interface JDK or Guava? Corresponding Guava utility class
Collection JDK Collections2 (avoiding conflict with java.util.Collections)
List JDK Lists
Set JDK Sets
SortedSet JDK Sets
Map JDK Maps
SortedMap JDK Maps
Queue JDK Queues
Multiset Guava Multisets
Multimap Guava Multimaps
BiMap Guava Maps
Table Guava Tables

JDK 7.0之前:

  1. List<TypeThatsTooLongForItsOwnGood> list = new ArrayList<TypeThatsTooLongForItsOwnGood>();

Guava提供如下方式:

  1. List<TypeThatsTooLongForItsOwnGood> list = Lists.newArrayList();
  2. Map<KeyType, LongishValueType> map = Maps.newLinkedHashMap();

JDK 7.0才支持:

  1. List<TypeThatsTooLongForItsOwnGood> list = new ArrayList<>();

Guava提供更多:

  1. Set<Type> copySet = Sets.newHashSet(elements);
  2. List<String> theseElements = Lists.newArrayList("alpha", "beta", "gamma");

指定大小:

  1. List<Type> exactly100 = Lists.newArrayListWithCapacity(100);
  2. List<Type> approx100 = Lists.newArrayListWithExpectedSize(100);
  3. Set<Type> approx100Set = Sets.newHashSetWithExpectedSize(100);  
    类似的:
  1. Multiset<String> multiset = HashMultiset.create();

对象工具类提供的方法,如:

  1. List<Integer> countUp = Ints.asList(1, 2, 3, 4, 5);
  2. List<Integer> countDown = Lists.reverse(theList); // {5, 4, 3, 2, 1}
  3. List<List<Integer>> parts = Lists.partition(countUp, 2); // {{1, 2}, {3, 4}, {5}}

不可变工具类提供的方法,如:

    1. Set<String> wordsWithPrimeLength = ImmutableSet.of("one", "two", "three", "six", "seven", "eight");
    2. Set<String> primes = ImmutableSet.of("two", "three", "five", "seven");
    3. SetView<String> intersection = Sets.intersection(primes, wordsWithPrimeLength); // contains "two", "three", "seven"
    4. // I can use intersection as a Set directly, but copying it can be more efficient if I use it a lot.
    5. return intersection.immutableCopy();

不可变集合 Immutable Collections的更多相关文章

  1. [Guava官方文档翻译] 7. Guava的Immutable Collection(不可变集合)工具 (Immutable Collections Explained)

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3538666.html ,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体 ...

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

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

  3. Immutable(不可变)集合

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

  4. [Guava学习笔记]Collections: 不可变集合, 新集合类型

    我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3843386.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...

  5. .NET不可变集合已经正式发布

    微软基础类库(Base Class Library)团队已经完成了.NET不可变集合的正式版本,但不包括ImmutableArray.与其一起发布的还包括针对其它不可变对象类型的设计指南. 如果你需要 ...

  6. java集合框架(Collections Framework)

    */ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...

  7. 在sql server中建存储过程,如果需要参数是一个可变集合怎么处理?

    在sql server中建存储过程,如果需要参数是一个可变集合的处理 原存储过程,@objectIds 为可变参数,比如 110,98,99 ALTER PROC [dbo].[Proc_totalS ...

  8. [Guava源码分析]ImmutableCollection:不可变集合

    摘要: 我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3888557.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的 ...

  9. 洗礼灵魂,修炼python(7)--元组,集合,不可变集合

    前面已经把列表的基本用法讲解完 接着讲python的几大核心之--元组(tuple) 1.什么是元组? 类似列表,但为不可变对象,之前提到列表是可变对象,所谓可变对象就是支持原处修改,并且在修改前后对 ...

随机推荐

  1. Android学习杂记

    Jni接口学习资料: http://www.cnblogs.com/lsnproj/archive/2012/01/09/2317519.html classLoader和插件化: http://bl ...

  2. web-app子元素

    ?表示可选,最多一个:*表示0个或多个. web-app (icon?, display-name?, description?, distributable?, context-param*, fi ...

  3. python操作mysql数据库的相关操作实例

    python操作mysql数据库的相关操作实例 # -*- coding: utf-8 -*- #python operate mysql database import MySQLdb #数据库名称 ...

  4. python中读取\写入CSV中数据的方法

  5. 黄聪: PHP WkHtmlToPdf/WkHtmlToImage 将网页直接转换成pdf和图片

    function convert($type='pdf') { $filename=time(); $url=$this->input->get("url"); if( ...

  6. R 报错:package ‘***’ is not available (for R version ****) 的解决方案

    R 安装sparklyr,ggplot2等包出现如下warning package '****' is not available (for R version 3.0.2) 系统环境 ubuntu1 ...

  7. 几个gcc的扩展功能

    -finstrument-functions  constructor   destructor __builtin_return_address http://linuxgazette.net/15 ...

  8. 怎样写 OpenStack Neutron 的 Extension (一)

    前两篇文章讨论了怎么写一个 Neutron 的插件.但是最基本的插件只包括 Network, Port,和 Subnet 三种资源.如果需要引入新的资源,比如一个二层的 gateway 的话,就需要在 ...

  9. 学习RFS,所有文章的参考

    所有文章的主要参考: CSDN博客:http://blog.csdn.net/tulituqi 微博:@齐涛-道长

  10. 删除word文档中表格后的空行

    处理办法为: 方法1:使上.下页边距数值缩小,从而使页面扩大能容纳下这一段落行.   方法2:光标处于最后段落行符号前,右键→段落→缩进和间距→间距→行距→固定值→设置值→1磅→确定.