HashMultimap 快速入门
类继承关系
构造器私有,不能直接new方法创建,类提供create方法创建对象
//构造器
private HashMultimap() {
super(new HashMap());
}
private HashMultimap(int expectedKeys, int expectedValuesPerKey) {
super(Maps.newHashMapWithExpectedSize(expectedKeys));
Preconditions.checkArgument(expectedValuesPerKey >= 0);
this.expectedValuesPerKey = expectedValuesPerKey;
}
private HashMultimap(Multimap<? extends K, ? extends V> multimap) {
super(Maps.newHashMapWithExpectedSize(multimap.keySet().size()));
this.putAll(multimap);
}
//创建对象方法
public static <K, V> HashMultimap<K, V> create() {
return new HashMultimap();
}
public static <K, V> HashMultimap<K, V> create(int expectedKeys, int expectedValuesPerKey) {
return new HashMultimap(expectedKeys, expectedValuesPerKey);
}
public static <K, V> HashMultimap<K, V> create(Multimap<? extends K, ? extends V> multimap) {
return new HashMultimap(multimap);
}
创建演示
// 创建一个默认的 HashMap<String, Set<Integer>>,容器的初始化容量与HashMap的默认值一样
HashMultimap<String, Integer> multimap = HashMultimap.create();
// 当我们知道容器的个数时,推荐使用下面这种方式,
// HashMap 设置容量为8, 每个HashSet的容量初始化为16
HashMultimap<String, Integer> multimap2 = HashMultimap.create(8, 16);
// 另外一个就是基于MultMap来创建的case了
HashMultimap<String, Integer> multimap3 = HashMultimap.create(multimap);
添加元素
// 添加单个元素
multimap.put("key1", 110);
// 添加多个元素
multimap.putAll("key2", Arrays.asList(1,4,3,6,3,10,5,5,1,2));
multimap.putAll("key3", Arrays.asList(1,4,3,6,3,10));
底层使用HashMap<K,HashSet>对象实现,因此value的值会自动去重,例如上面的key2,输出集合时会去除重复元素。
上述执行输出结果:
//输出集合对象
System.out.println(multimap);
//输出每个key里不重复的元素,多个key中相互之间有相同元素也会输出
System.out.println(multimap.values());
{key2=[1, 2, 3, 4, 5, 6, 10], key3=[1, 10, 3, 4, 6]}
[1, 2, 3, 4, 5, 6, 10, 1, 10, 3, 4, 6]
删除元素
// 移除skill对应的集合中,value=3的元素
multimap.remove("key1", 1);
// 移除key
multimap.removeAll("key2");
使用remove删除时会删除所有重复元素,例如上述删除 value 为 1 ,则删除后输出:
{key1=[2, 3, 4, 5, 6, 10]}
所有 key1 中的 1 被删除, key2 和 对应的 value 也都被删除。
替换元素
如果我们希望将整个value都换成一个新的集合,那么可以使用 replaceValue()
// 直接替换 key1 对应的 value 集合,新的值为 {100, 200, 300}
multimap.replaceValues("key1", Arrays.asList(111, 222, 333));
输出结果:
{key1=[333, 222, 111]}
获取元素及遍历
获取元素
// 获取对应的value集合,当不存在时,返回空集合(不会返回 null)
Set<Object> set = multimap.get("key1");
Set<Object> set1 = multimap.get("key2");// key2上面已经删除
System.out.println(set);
System.out.println(set1);
输出结果为:
[333, 222, 111]
[]
遍历
将上面删除的 key2 打开,可根据需求使用不同的方式遍历:
// 输出所有的 value:
// 输出所有的 value
for (Object value : multimap.values()) {
System.out.println(value);
}
输出结果:
333
222
111
1
10
3
4
6
输出对应 key 的 value:
//输出对应 key 的 value
for (Object value : multimap.get("key1")) {
System.out.println(value);
}
输出结果:
333
222
111
输出所有 key 及对应的 value:
//输出所有 key 及对应的 value
for (Map.Entry<Object, Object> entry : multimap.entries()) {
System.out.println(entry.getKey() + ":" + entry.getValue());
}
输出结果:
key1:333
key1:222
key1:111
key2:1
key2:10
key2:3
key2:4
key2:6
输出所有的key
multimap.putAll("key1", Arrays.asList(1, 4, 3, 6, 3, 10, 5, 5, 1, 2));
multimap.putAll("key2", Arrays.asList(1, 4, 3, 6, 3, 10));
Multiset<Object> keys = multimap.keys();
Set<Object> objects = multimap.keySet();
System.out.println(keys);
System.out.println(objects);
输出结果:
[key1 x 7, key2 x 5]
[key1, key2]
keys()方法输出的是 key 值和 value 去重后的个数;
keySet()方法输出所有 key 值。
输出所有的value
multimap.putAll("key1", Arrays.asList(1, 4, 3, 6, 3, 10, 5, 5, 1, 2));
multimap.putAll("key2", Arrays.asList(1, 4, 3, 6, 3, 10));
Collection<Object> values1 = multimap.values();
System.out.println(values1);
输出结果:
[1, 2, 3, 4, 5, 6, 10, 1, 10, 3, 4, 6]
输出的是每个 key 中不重复的元素,多个 key 之间相同的元素会输出。