我是靠谱客的博主 精明咖啡,最近开发中收集的这篇文章主要介绍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);
}

 

转载于:https://www.cnblogs.com/lijia0511/p/5708302.html

最后

以上就是精明咖啡为你收集整理的MultiMap类关系实现方法的全部内容,希望文章能够帮你解决MultiMap类关系实现方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部