MultiMap

类关系

ArrayListMultiMap.java

Multimap <I>
|
|
AbstractMultimap <A>                  Serializable <I>    
|__________________________________________|
|
AbstractMapBasedMultimap <A>  
|
|
AbstractListMultimap <A>              ListMultimap <I>
|__________________________________________|
|
ArrayListMultiMap

LinkedListMultiMap.java

Multimap <I>
|
|
AbstractMultimap <A>              ListMultimap <I>                 Serializable <I>
|__________________________________________|______________________________|
|
LinkedListMultimap

TreeMultimap.java

Multimap <I>
|
|
AbstractMultimap <A>                  Serializable <I>    
|__________________________________________|
|
AbstractMapBasedMultimap <A>          SetMultimap <I>    
|__________________________________________|
|
AbstractSetMultimap <A>              SortedSetMultimap <I>
|__________________________________________|
|
AbstractSortedSetMultimap <A> 
|
|
AbstractSortedKeySortedSetMultimap <A>
|
|
TreeMultimap

实现方法

ArrayListMultimap

ArrayListMultiMap.java是以ArrayList为Collection的特定实现,这个类中没有太多的实际代码,主要是createCollection()方法中特定的产生一个ArrayList作为Collection。

AbstractListMultimap.java是AbstractMultimap的一个List专有版本,这个类和ListMultimap接口一起,将Multimap的方法都重写为List。

AbstractMapBasedMultimap.java则是所有以Map为核心的Multimap的基本实现,这里实现了所有Multimap的方法,是最重要的一部分。

clear方法,先将每个collection清空,再把map清空

1 public void clear() {
2     // Clear each collection, to make previously returned collections empty.
3     for (Collection<V> collection : map.values()) {
4       collection.clear();
5     }
6     map.clear();
7     totalSize = 0;
8 }

 

put方法,我们可以发现这里的size是每多一个KV对就加1,而不是唯一Key的数量,这点和Map不同

 1 public boolean put(@Nullable K key, @Nullable V value) {
 2     Collection<V> collection = map.get(key);
 3     // 如果这是一个新key没有对应的Collection
 4     if (collection == null) {
 5       // 先根据子类实现创建一个相应的Collection
 6       collection = createCollection(key);
 7       // 将KV对加入Map中
 8       if (collection.add(value)) {
 9         totalSize++;
10         map.put(key, collection);
11         return true;
12       } else {
13         throw new AssertionError("New Collection violated the Collection spec");
14       }
15     // 如果已经有这个key了,就加入它的Collection
16     } else if (collection.add(value)) {
17       totalSize++;
18       return true;
19     } else {
20       return false;
21     }
22 }

 

removeAll方法,需要返回删除的Value,所以要一个临时变量存起来

 1 public Collection<V> removeAll(@Nullable Object key) {
 2     // 先将Key移出
 3     Collection<V> collection = map.remove(key);
 4     // 如果Value为空,则返回空集合
 5     if (collection == null) {
 6       return createUnmodifiableEmptyCollection();
 7     }
 8     // 否则将Value的值拷贝到输出集合中,再把Value清空
 9     Collection<V> output = createCollection();
10     output.addAll(collection);
11     totalSize -= collection.size();
12     collection.clear();
13     // 返回输出集合
14     return unmodifiableCollectionSubclass(output);
15 }

 

size方法,注意这里返回的是KV数,而非K的唯一个数

1 public int size() {
2     return totalSize;
3 }

 

isEmpty方法,判断KV数是否为0

1 public boolean isEmpty() {
2     return size() == 0;
3 }

 

get方法

public Collection<V> get(@Nullable K key) {
    Collection<V> collection = map.get(key);
    // 如果没有Value就新建一个Collection
    if (collection == null) {
      collection = createCollection(key);
    }
    return wrapCollection(key, collection);
}    

 

AbstractMultimap.java也实现了一些基本方法,和上一个文件一起涵盖了所有API

remove方法

1 public boolean remove(@Nullable Object key, @Nullable Object value) {
2     // 从Map中按照key找到该集合
3     Collection<V> collection = asMap().get(key);
4     // 如果集合不为空,则找到集合中的这个值并删除
5     return collection != null && collection.remove(value);
6 }

 

putAll方法,以key为第一参数,以一个Iterable为第二参数

 1 public boolean putAll(@Nullable K key, Iterable<? extends V> values) {
 2     checkNotNull(values);
 3     // make sure we only call values.iterator() once
 4     // and we only call get(key) if values is nonempty
 5     if (values instanceof Collection) {
 6       Collection<? extends V> valueCollection = (Collection<? extends V>) values;
 7       // 拿出Collection然后把新的addAll进去
 8       return !valueCollection.isEmpty() && get(key).addAll(valueCollection);
 9     } else {
10       Iterator<? extends V> valueItr = values.iterator();
11       // 拿出Iterator然后把新的addAll进去
12       return valueItr.hasNext() && Iterators.addAll(get(key), valueItr);
13     }
14 }

 

putAll方法,以另一个Multimap为参数

1 public boolean putAll(Multimap<? extends K, ? extends V> multimap) {
2     boolean changed = false;
3     for (Map.Entry<? extends K, ? extends V> entry : multimap.entries()) {
4       changed |= put(entry.getKey(), entry.getValue());
5     }
6     return changed;
7 }

 

replace方法

1 public Collection<V> replaceValues(@Nullable K key, Iterable<? extends V> values) {
2     checkNotNull(values);
3     // 先移除所有
4     Collection<V> result = removeAll(key);
5     // 在加入新的值
6     putAll(key, values);
7     return result;
8 }

 

containsValue方法

1 public boolean containsValue(@Nullable Object value) {
2     // 检查每一个Collection是否有这个值
3     for (Collection<V> collection : asMap().values()) {
4       if (collection.contains(value)) {
5         return true;
6       }
7     }
8     return false;
9 }

 

containsEntry方法,实际上是用get来判断是否有这个key,然后再看是否有这个值

public boolean containsEntry(@Nullable Object key, @Nullable Object value) {
    Collection<V> collection = asMap().get(key);
    return collection != null && collection.contains(value);
}

 

posted @ 2016-07-26 17:31  走在大牛的路上  阅读(356)  评论(0编辑  收藏  举报