文章目录
  1. 1. Immutable Collections
  2. 2. New collection types
    1. 2.1. Multiset:把重复的元素放入集合
      1. 2.1.1. Multiset不是Map
      2. 2.1.2. Multiset的各种实现
    2. 2.2. Multimap:在Map的value里面放多个元素
      1. 2.2.1. Multimap不是Map
      2. 2.2.2. 一些实现
    3. 2.3. BiMap:双向Map
    4. 2.4. Table
    5. 2.5. ClassToInstanceMap
    6. 2.6. RangeSet
  3. 3. Powerful collection utilities
  4. 4. Extension utilities
  5. 5. 参考

Google Guava Collections是 Java Collections Framework 的增强和扩展。每个 Java 开发者都会在工作中使用各种数据结构,很多情况下 Java Collections Framework 可以帮助你完成这类工作。但是在有些场合你使用了 Java Collections Framework 的 API,但还是需要写很多代码来实现一些复杂逻辑,这个时候就可以尝试使用 Guava Collections 来帮助你完成这些工作。这些高质量的 API 使你的代码更短,更易于阅读和修改,工作更加轻松。

下面我们就介绍一下它的功能:

Immutable Collections

例子:

public static final ImmutableSet<String> COLOR_NAMES = ImmutableSet.of(
  "red",
  "orange",
  "yellow",
  "green",
  "blue",
  "purple");

class Foo {
  final ImmutableSet<Bar> bars;
  Foo(Set<Bar> bars) {
    this.bars = ImmutableSet.copyOf(bars); // defensive copy!
  }
}

New collection types

Guava引入了一些JDK没有但是很有用的集合对象。

Multiset:把重复的元素放入集合

要统计一份文档某个单词出现的次数,传统做法如下:

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);
  }
}

用Guava的话可以:

HashMultiset<String> multiSet = HashMultiset.create(); 
multiSet.addAll(words); 
//count word “the”
Integer count = multiSet.count(“the”);

Multiset不是Map

Multiset继承自JDK中的Collection接口,而不是Set接口。其和Map的区别是:

  1. Multiset中的元素计数只能是正数。任何元素的计数都不能为负,也不能是0。elementSet()和entrySet()视图中也不会有这样的元素。
  2. multiset.size()返回集合的大小,等同于所有元素计数的总和。对于不重复元素的个数,应使用elementSet().size()方法。(因此,add(E)把multiset.size()增加1)
  3. multiset.iterator()会迭代重复元素,因此迭代长度等于multiset.size()。
  4. Multiset支持直接增加、减少或设置元素的计数。setCount(elem, 0)等同于移除所有elem。
  5. 对multiset 中没有的元素,multiset.count(elem)始终返回0。

Multiset的各种实现

HashMutltiset、TreeMultiset、LinkedHashMultiset、ConcurrentHashMultiset、ImmutableMultiset

Multimap:在Map的value里面放多个元素

举个记名投票的例子。所有选票都放在一个 List 里面,List 的每个元素包括投票人和选举人的名字。我们可以这样写 :

//Key is candidate name, its value is his voters 
 HashMap<String, HashSet<String>> hMap = new HashMap<String, HashSet<String>>(); 
 for(Ticket ticket: tickets){ 
    HashSet<String> set = hMap.get(ticket.getCandidate()); 
    if(set == null){ 
        set = new HashSet<String>(); 
        hMap.put(ticket.getCandidate(), set); 
    } 
    set.add(ticket.getVoter()); 
 }

而使用Guava的话就可以:

HashMultimap<String, String> map = HashMultimap.create(); 
for(Ticket ticket: tickets){ 
    map.put(ticket.getCandidate(), ticket.getVoter()); 
}

Multimap不是Map

一些实现

  1. HashMultimap: key 放在 HashMap,而 value 放在 HashSet,即一个 key 对应的 value 不可重复
  2. ArrayListMultimap: key 放在 HashMap,而 value 放在 ArrayList,即一个 key 对应的 value 有顺序可重复
  3. LinkedHashMultimap: key 放在 LinkedHashMap,而 value 放在 LinkedHashSet,即一个 key 对应的 value 有顺序不可重复
  4. TreeMultimap: key 放在 TreeMap,而 value 放在 TreeSet,即一个 key 对应的 value 有排列顺序
  5. ImmutableMultimap: 不可修改的 Multimap

BiMap:双向Map

Table

ClassToInstanceMap

RangeSet

Powerful collection utilities

Extension utilities

参考

  1. Collections
文章目录
  1. 1. Immutable Collections
  2. 2. New collection types
    1. 2.1. Multiset:把重复的元素放入集合
      1. 2.1.1. Multiset不是Map
      2. 2.1.2. Multiset的各种实现
    2. 2.2. Multimap:在Map的value里面放多个元素
      1. 2.2.1. Multimap不是Map
      2. 2.2.2. 一些实现
    3. 2.3. BiMap:双向Map
    4. 2.4. Table
    5. 2.5. ClassToInstanceMap
    6. 2.6. RangeSet
  3. 3. Powerful collection utilities
  4. 4. Extension utilities
  5. 5. 参考