Google Guava API学习笔记(2):集合
来源:互联网 发布:d3.js 地图 编辑:程序博客网 时间:2024/06/05 17:08
不可变集合 Immutable Collections
例子
为啥?
不可变对象拥有众多好处:
防止可变对象拷贝是一个良好的编程习惯,请看这儿: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了。
咋整?
可使用如下方法创建不可变集合:
使用copeOf(0
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要快,毕竟它是指定大小的。
在哪?
InterfaceJDK or Guava?Immutable VersionCollectionJDKImmutableCollectionListJDKImmutableListSetJDKImmutableSetSortedSet/NavigableSetJDKImmutableSortedSetMapJDKImmutableMapSortedMapJDKImmutableSortedMapMultisetGuavaImmutableMultisetSortedMultisetGuavaImmutableSortedMultisetMultimapGuavaImmutableMultimapListMultimapGuavaImmutableListMultimapSetMultimapGuavaImmutableSetMultimapBiMapGuavaImmutableBiMapClassToInstanceMapGuavaImmutableClassToInstanceMapTableGuavaImmutableTable
创建集合
简化集合创建
原来多麻烦:
现在:
Table
工具类
InterfaceJDK or Guava?Corresponding Guava utility classCollectionJDKCollections2 (avoiding conflict with java.util.Collections)ListJDKListsSetJDKSetsSortedSetJDKSetsMapJDKMapsSortedMapJDKMapsQueueJDKQueuesMultisetGuavaMultisetsMultimapGuavaMultimapsBiMapGuavaMapsTableGuavaTables
JDK 7.0之前:
Guava提供如下方式:
JDK 7.0才支持:
Guava提供更多:
指定大小:
类似的:
对象工具类提供的方法,如:
不可变工具类提供的方法,如:
扩展工具类
例子
- 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要快,毕竟它是指定大小的。
在哪?
InterfaceJDK or Guava?Immutable VersionCollectionJDKImmutableCollectionListJDKImmutableListSetJDKImmutableSetSortedSet/NavigableSetJDKImmutableSortedSetMapJDKImmutableMapSortedMapJDKImmutableSortedMapMultisetGuavaImmutableMultisetSortedMultisetGuavaImmutableSortedMultisetMultimapGuavaImmutableMultimapListMultimapGuavaImmutableListMultimapSetMultimapGuavaImmutableSetMultimapBiMapGuavaImmutableBiMapClassToInstanceMapGuavaImmutableClassToInstanceMapTableGuavaImmutableTable
创建集合
简化集合创建
原来多麻烦:
- 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
- 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
工具类
InterfaceJDK or Guava?Corresponding Guava utility classCollectionJDKCollections2 (avoiding conflict with java.util.Collections)ListJDKListsSetJDKSetsSortedSetJDKSetsMapJDKMapsSortedMapJDKMapsQueueJDKQueuesMultisetGuavaMultisetsMultimapGuavaMultimapsBiMapGuavaMapsTableGuavaTables
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();
扩展工具类
略了,看:http://code.google.com/p/guava-libraries/wiki/CollectionHelpersExplained
转自:http://stamen.iteye.com/blog/1669120
阅读全文
0 0
- Google Guava API学习笔记(2):集合
- Google Guava API学习笔记(1):基础
- Google Guava学习笔记
- Google Guava学习笔记
- guava学习笔记-集合
- Guava学习笔记:Guava新增集合类型
- Guava学习笔记:Guava新增集合类型
- Guava学习笔记:Guava新增集合类型
- Guava学习笔记:Guava新增集合类型
- Guava学习笔记:Guava新集合
- Google-Guava学习:不可变集合
- Google-Guava学习:新集合类型
- Google Guava学习(6)-Guava集合工具 Multiset
- Google Guava学习(7)-Guava集合工具 Bimap接口
- Google Guava学习(8)-Guava集合工具 Table接口
- Google Guava-集合类型
- Guava学习笔记:Google Guava 类库简介
- Guava学习笔记:Google Guava 类库简介
- ios气泡弹出框popover效果系统原生方法实现
- 指针变量值以及指针类型的作用
- RandomAccess
- spring、springmvc、hibernate的整合
- Codeforces Round #430 (Div. 2) B. Gleb And Pizza(数论)
- Google Guava API学习笔记(2):集合
- 一如昨日的时光,一如昨日的酒--
- Linux安装配置蒲公英VPN 私网环境轻松实现异地SSH远程管理
- c#中开发ActiveX的学习笔记
- Fragment常见问题
- HDU 6161 乱搞+dp
- 饿了么,百度外卖,美团外卖如何共用同一台打印机(演示)
- >>0取整
- Gauge中文文档(3)—深入开始