概述
类关系
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); }
转载于:https://www.cnblogs.com/lijia0511/p/5708302.html
最后
以上就是精明咖啡为你收集整理的MultiMap类关系实现方法的全部内容,希望文章能够帮你解决MultiMap类关系实现方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复