不可变集合 Immutable Collections
例子
- public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of(
- "red",
- "orange",
- "yellow",
- "green",
- "blue",
- "purple");
- class Foo {
- Set<Bar> bars;
- Foo(Set<Bar> bars) {
- this.bars = ImmutableSet.copyOf(bars); // defensive copy!
- }
- }
为啥?
不可变对象拥有众多好处:
- 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, 看示例:
- public static final ImmutableSet<Color> GOOGLE_COLORS =
- ImmutableSet.<Color>builder()
- .addAll(WEBSAFE_COLORS)
- .add(new Color(0, 191, 255))
- .build();
使用copeOf(0
- ImmutableSet<String> foobar = ImmutableSet.of("foo", "bar", "baz");
- thingamajig(foobar);
- void thingamajig(Collection<String> collection) {
- ImmutableList<String> defensiveCopy = ImmutableList.copyOf(collection);
- ...
- }
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 |
创建集合
简化集合创建
原来多麻烦:
- Map<String, Integer> counts = new HashMap<String, Integer>();
- for (String word : words) {
- Integer count = counts.get(word);
- if (count == null) {
- counts.put(word, 1);
- } else {
- counts.put(word, count + 1);
- }
- }
现在:
- Multiset<String> wordsMultiset = HashMultiset.create();
- wordsMultiset.addAll(words);
Table
Java代码 ![]()
- Table<Vertex, Vertex, Double> weightedGraph = HashBasedTable.create();
- weightedGraph.put(v1, v2, 4);
- weightedGraph.put(v1, v3, 20);
- weightedGraph.put(v2, v3, 5);
- weightedGraph.row(v1); // returns a Map mapping v2 to 4, v3 to 20
- 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之前:
- List<TypeThatsTooLongForItsOwnGood> list = new ArrayList<TypeThatsTooLongForItsOwnGood>();
Guava提供如下方式:
- List<TypeThatsTooLongForItsOwnGood> list = Lists.newArrayList();
- Map<KeyType, LongishValueType> map = Maps.newLinkedHashMap();
JDK 7.0才支持:
- List<TypeThatsTooLongForItsOwnGood> list = new ArrayList<>();
Guava提供更多:
- Set<Type> copySet = Sets.newHashSet(elements);
- List<String> theseElements = Lists.newArrayList("alpha", "beta", "gamma");
指定大小:
- List<Type> exactly100 = Lists.newArrayListWithCapacity(100);
- List<Type> approx100 = Lists.newArrayListWithExpectedSize(100);
- Set<Type> approx100Set = Sets.newHashSetWithExpectedSize(100);
类似的:
- Multiset<String> multiset = HashMultiset.create();
对象工具类提供的方法,如:
- List<Integer> countUp = Ints.asList(1, 2, 3, 4, 5);
- List<Integer> countDown = Lists.reverse(theList); // {5, 4, 3, 2, 1}
- List<List<Integer>> parts = Lists.partition(countUp, 2); // {{1, 2}, {3, 4}, {5}}
不可变工具类提供的方法,如:
- Set<String> wordsWithPrimeLength = ImmutableSet.of("one", "two", "three", "six", "seven", "eight");
- Set<String> primes = ImmutableSet.of("two", "three", "five", "seven");
- SetView<String> intersection = Sets.intersection(primes, wordsWithPrimeLength); // contains "two", "three", "seven"
- // I can use intersection as a Set directly, but copying it can be more efficient if I use it a lot.
- return intersection.immutableCopy();
不可变集合 Immutable Collections的更多相关文章
- [Guava官方文档翻译] 7. Guava的Immutable Collection(不可变集合)工具 (Immutable Collections Explained)
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3538666.html ,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体 ...
- Guava学习笔记:Immutable(不可变)集合
不可变集合,顾名思义就是说集合是不可被修改的.集合的数据项是在创建的时候提供,并且在整个生命周期中都不可改变. 为什么要用immutable对象?immutable对象有以下的优点: 1.对不可靠的客 ...
- Immutable(不可变)集合
Immutable(不可变)集合 不可变集合,顾名思义就是说集合是不可被修改的.集合的数据项是在创建的时候提供,并且在整个生命周期中都不可改变. 为什么要用immutable对象?immutable对 ...
- java代码之美(4)---guava之Immutable(不可变)集合
Immutable(不可变)集合 一.概述 guava是google的一个库,弥补了java语言的很多方面的不足,很多在java8中已有实现,暂时不展开.Collections是jdk提供的一个工具类 ...
- java代码(4)---guava之Immutable(不可变)集合
Immutable(不可变)集合 一,概述 guava是google的一个库,弥补了java语音的很多方面的不足,很多在java8中已有实现,暂时不展开,Collections是jdk提供的一个工 ...
- Guava集合--Immutable(不可变)集合
所谓不可变集合,顾名思义就是定义了之后不可修改的集合. 一.为什么要使用不可变集合 不可变对象有很多优点,包括: 当对象被不可信的库调用时,不可变形式是安全的: 不可变对象被多个线程调用时,不存在竞态 ...
- Guava Immutable 不可变集合
Immutable是为了创建不可变集合使用,不可变集合在很多情况下能提高系统性能.一般使用 .of()或者.builder()<>().put().build()初始化创建不可变集合
- 20_集合_第20天(Map、可变参数、Collections)_讲义
今日内容介绍 1.Map接口 2.模拟斗地主洗牌发牌 01Map集合概述 A:Map集合概述: 我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式 ...
- java 集合Collections 工具类:排序,查找替换。Set、List、Map 的of方法创建不可变集合
Collections 工具类 Java 提供1个操作 Set List Map 等集合的工具类 Collections ,该工具类里提供了大量方法对集合元素进行排序.查询和修改等操作,还提供了将集合 ...
随机推荐
- Comparison of B-Tree and Hash Indexes
Understanding the B-tree and hash data structures can help predict how different queries perform on ...
- Sklearn库例子1:Sklearn库中AdaBoost和Decision Tree运行结果的比较
DisCrete Versus Real AdaBoost 关于Discrete 和Real AdaBoost 可以参考博客:http://www.cnblogs.com/jcchen1987/p/4 ...
- 使用prototype 对象定义类成员
使用prototype 对象定义类成员上一节介绍了类的实现机制以及构造函数的实现,现在介绍另一种为类添加成员的机制:prototype 对象.当new 一个function 时,该对象的成员将自动赋给 ...
- Hermes:来自腾讯的实时检索分析平台
实时检索分析平台(Hermes)是腾讯数据平台部为大数据分析业务提供一套实时的.多维的.交互式的查询.统计.分析系统,为各个产品在大数据的统计分析方面提供完整的解决方案,让万级维度.千亿级数据下的秒级 ...
- selenium+python自动化之登录案例
一.登录 1.先打开浏览器 2.打开论坛主页:http://www.hordehome.com/ 3.查找元素之前可以先设置元素等待:implicitly_wait() 4.点登录按钮,弹出登录框 5 ...
- 在iframe下的页面锚点失效问题,用jquery进行修复
应用场景是:iframe页面没有滚动条,在父窗体中出现滚动条,锚点标记就会失效,因为,锚点是根据当前窗口滚动条滚动窗口的,成为子窗体后没有了滚动条,自然不会滚动. 解决办法是:用js判断页面是否被嵌套 ...
- 多线程编程之Windows环境下创建新线程
转自: http://www.cnblogs.com/lgxqf/archive/2009/02/10/1387480.html 在 Win32 API 中,创建线程的基本函数是 CreateThre ...
- 【jmeter】JMeter测试MongoDB
JMeter测试MongoDB性能有两种方式,一种是利用JMeter直接进行测试MongoDB,还有一种是写Java代码方式测试MongoDB性能. 第一种方法 1.编写Java代码,内容如下: pa ...
- 关于双击事件.MouseEvent.DOUBLE_CLICK
as3提供了双击事件的调用,但有时候碰到双击事件无法响应,所以总结下原因.先摘录一段官方关于 doubleClick 事件发生的条件.如果 InteractiveObject 的 doubleClic ...
- (转)C# 使用BackgroundWorker
本文转载自:http://blog.csdn.net/andrew_wx/article/details/6615077 该例子为使用BackgroundWorker在TextBox文本中产生一个10 ...