例子

  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. java代码之美(4)---guava之Immutable(不可变)集合

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

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

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

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

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

  7. Guava Immutable 不可变集合

    Immutable是为了创建不可变集合使用,不可变集合在很多情况下能提高系统性能.一般使用 .of()或者.builder()<>().put().build()初始化创建不可变集合

  8. 20_集合_第20天(Map、可变参数、Collections)_讲义

    今日内容介绍 1.Map接口 2.模拟斗地主洗牌发牌 01Map集合概述 A:Map集合概述: 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式 ...

  9. java 集合Collections 工具类:排序,查找替换。Set、List、Map 的of方法创建不可变集合

    Collections 工具类 Java 提供1个操作 Set List Map 等集合的工具类 Collections ,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操作,还提供了将集合 ...

随机推荐

  1. Comparison of B-Tree and Hash Indexes

    Understanding the B-tree and hash data structures can help predict how different queries perform on ...

  2. Sklearn库例子1:Sklearn库中AdaBoost和Decision Tree运行结果的比较

    DisCrete Versus Real AdaBoost 关于Discrete 和Real AdaBoost 可以参考博客:http://www.cnblogs.com/jcchen1987/p/4 ...

  3. 使用prototype 对象定义类成员

    使用prototype 对象定义类成员上一节介绍了类的实现机制以及构造函数的实现,现在介绍另一种为类添加成员的机制:prototype 对象.当new 一个function 时,该对象的成员将自动赋给 ...

  4. Hermes:来自腾讯的实时检索分析平台

    实时检索分析平台(Hermes)是腾讯数据平台部为大数据分析业务提供一套实时的.多维的.交互式的查询.统计.分析系统,为各个产品在大数据的统计分析方面提供完整的解决方案,让万级维度.千亿级数据下的秒级 ...

  5. selenium+python自动化之登录案例

    一.登录 1.先打开浏览器 2.打开论坛主页:http://www.hordehome.com/ 3.查找元素之前可以先设置元素等待:implicitly_wait() 4.点登录按钮,弹出登录框 5 ...

  6. 在iframe下的页面锚点失效问题,用jquery进行修复

    应用场景是:iframe页面没有滚动条,在父窗体中出现滚动条,锚点标记就会失效,因为,锚点是根据当前窗口滚动条滚动窗口的,成为子窗体后没有了滚动条,自然不会滚动. 解决办法是:用js判断页面是否被嵌套 ...

  7. 多线程编程之Windows环境下创建新线程

    转自: http://www.cnblogs.com/lgxqf/archive/2009/02/10/1387480.html 在 Win32 API 中,创建线程的基本函数是 CreateThre ...

  8. 【jmeter】JMeter测试MongoDB

    JMeter测试MongoDB性能有两种方式,一种是利用JMeter直接进行测试MongoDB,还有一种是写Java代码方式测试MongoDB性能. 第一种方法 1.编写Java代码,内容如下: pa ...

  9. 关于双击事件.MouseEvent.DOUBLE_CLICK

    as3提供了双击事件的调用,但有时候碰到双击事件无法响应,所以总结下原因.先摘录一段官方关于 doubleClick 事件发生的条件.如果 InteractiveObject 的 doubleClic ...

  10. (转)C# 使用BackgroundWorker

    本文转载自:http://blog.csdn.net/andrew_wx/article/details/6615077 该例子为使用BackgroundWorker在TextBox文本中产生一个10 ...