java.util.Map
接口是双列集合的顶级接口。
一、Map特点或规范
双列集合,由 key 映射 value 的对象。
Map 不能包含重复的 key ,且每个 key 只能映射一个 value 。
Map 接口提供了三个集合的视图,key集合 、value集合 、**Entry<K, V>集合。
Map 的顺序定义为 集合视图 的迭代器返回其元素的顺序。
有序性
java.util.TreeMap
类有序
其他,如 java.util.HashMap
类无序
1.1 构造器规范 所有 Map 实现类都应该提供两个“标准”构造函数,Map 接口无法强制子类执行此规范(因为接口不能包含构造函数),但JDK中的所有 Map 实现都符合要求:
无参构造器 ,用于创建一个空 Map 。
参数类型为 Map 的构造器 ,它创建一个具有相同键值的新映射映射作为其论点。
1.2 key/value限制 某些 Map 实现类对可能包含的 key 和 value 有限制。如,某些实现禁止空 key 和空 value,有些实现类对键的类型有限制。如果插入不合格的 key 或 value 会引发异常,通常是 NullPointerException
或 **ClassCastException
**。
二、Map.Entry接口 Map.Entry 类映射实体,即:key-value 键值对。**Map.entrySet()
** 方法可以返回 Map 的实体集合视图,即:**Set<Map.Entry<K, V>>
**。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 interface Entry <K, V> { K getKey () ; V getValue () ; V setValue (V value) ; boolean equals (Object o) ; int hashCode () ; public static <K extends Comparable <? super K>, V> Comparator<Map.Entry<K,V>> comparingByKey() { return (Comparator<Map.Entry<K, V>> & Serializable) (c1, c2) -> c1.getKey().compareTo(c2.getKey()); } public static <K, V extends Comparable <? super V>> Comparator<Map.Entry<K,V>> comparingByValue() { return (Comparator<Map.Entry<K, V>> & Serializable) (c1, c2) -> c1.getValue().compareTo(c2.getValue()); } public static <K, V> Comparator<Map.Entry<K, V>> comparingByKey(Comparator<? super K> cmp) { Objects.requireNonNull(cmp); return (Comparator<Map.Entry<K, V>> & Serializable) (c1, c2) -> cmp.compare(c1.getKey(), c2.getKey()); } public static <K, V> Comparator<Map.Entry<K, V>> comparingByValue(Comparator<? super V> cmp) { Objects.requireNonNull(cmp); return (Comparator<Map.Entry<K, V>> & Serializable) (c1, c2) -> cmp.compare(c1.getValue(), c2.getValue()); } }
三、方法描述 3.1 查询方法 返回 Map 中 key-value 映射的数量。如果 Map 中包含元素多于 **Integer.MAX_VALUE
**,则返回 **Integer.MAX_VALUE
**。
如果 Map 不包含 key-value 映射,则返回 **true
**。
如果 Map 包含指定 key 的映射,则返回 **true
,即: key == null ? k == null : key.equals(k)
**。
1 boolean containsKey (Object key) ;
如果 Map 将一个或多个 key 映射到指定 value,则返回 **true
,即: value == null ? v == null : value.equals(v)
**。
1 boolean containsValue (Object value) ;
返回指定 key 映射的 value,如果 Map 不包含 key 的映射,则返回 **null
**,如果此 Map 允许空值,则返回值 null
不一定表示 Map 不包含该 key 的映射,Map 也可能将 key 明确映射为 null
, containsKey()
方法可用于区分这两种情况。
3.2 修改操作 将指定的 value 与 Map 中的指定 key 相关联。如果 Map 先前包含 key 的映射,则指定的 value 将替换旧 value。返回之前与 key 相关联的 value,如果之前没有关联,则返回 **null
**。
如果存在该 key,则从 Map 中移除 key 的映射。 返回删除之前与 key 关联的 value,如果 Map 不包含该 key 的映射,则返回 **null
**。
3.3 批量操作 将指定 Map 中的所有实体复制到此 Map 中。
1 void putAll (Map<? extends K, ? extends V> m) ;
将当前 Map 中所有实体删除。
3.4 视图 返回 Map 中包含的 key 的 Set 视图。
返回 Map 中包含的 value 的 Collection 视图。
返回 Map 中包含的 Entry 实体的 Set 视图。
1 Set<Map.Entry<K, V>> entrySet();
3.5 equals、hashCode 将指定对象与此 Map 进行相等性比较。如果给定对象也是一个 Map,并且两个 Map 指向同一个 Map,则返回 **true
**。 这可确保equals方法在Map接口的不同实现中正常工作。
1 boolean equals (Object o) ;
返回 Map 的哈希值。Map 的哈希值的定义为 Map 的 entrySet()
视图中每个条目的哈希值的总和。
3.6 默认方法 返回指定 key 映射到的 value,如果此 Map 不包含 key 的映射,则返回 defaultValue。
1 2 3 4 5 6 default V getOrDefault (Object key, V defaultValue) { V v; return (((v = get(key)) != null ) || containsKey(key)) ? v : defaultValue; }
对此 Map 中的每个条目执行给定操作,直到处理完所有条目或操作引发异常。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 default void forEach (BiConsumer<? super K, ? super V> action) { Objects.requireNonNull(action); for (Map.Entry<K, V> entry : entrySet()) { K k; V v; try { k = entry.getKey(); v = entry.getValue(); } catch (IllegalStateException ise) { throw new ConcurrentModificationException (ise); } action.accept(k, v); } }
将每个条目的值替换为在该条目上调用给定函数的结果,直到所有条目都已处理或函数抛出异常。函数抛出的异常将转发给调用者。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 default void replaceAll (BiFunction<? super K, ? super V, ? extends V> function) { Objects.requireNonNull(function); for (Map.Entry<K, V> entry : entrySet()) { K k; V v; try { k = entry.getKey(); v = entry.getValue(); } catch (IllegalStateException ise) { throw new ConcurrentModificationException (ise); } v = function.apply(k, v); try { entry.setValue(v); } catch (IllegalStateException ise) { throw new ConcurrentModificationException (ise); } } }
如果指定的 key 尚未与 value 关联或映射为 null,则将其与给定 value 关联并返回 null,否则返回当前 value。默认实现不保证此方法的同步或原子性属性。提供原子性保证的任何实现都必须覆盖此方法并记录其并发属性。
1 2 3 4 5 6 7 default V putIfAbsent (K key, V value) { V v = get(key); if (v == null ) { v = put(key, value); } return v; }
仅当指定 key 映射到指定 value 时才删除该条目。
1 2 3 4 5 6 7 8 9 default boolean remove (Object key, Object value) { Object curValue = get(key); if (!Objects.equals(curValue, value) || (curValue == null && !containsKey(key))) { return false ; } remove(key); return true ; }
仅当指定 key 映射到指定 value 时才替换指定 key 的条目。
1 2 3 4 5 6 7 8 9 default boolean replace (K key, V oldValue, V newValue) { Object curValue = get(key); if (!Objects.equals(curValue, oldValue) || (curValue == null && !containsKey(key))) { return false ; } put(key, newValue); return true ; }
仅当指定 key 映射到某个 value 时才替换该条目。
1 2 3 4 5 6 7 default V replace (K key, V value) { V curValue; if (((curValue = get(key)) != null ) || containsKey(key)) { curValue = put(key, value); } return curValue; }
如果指定的 key 尚未与 value 关联或映射为 null,则尝试使用给定的映射函数计算其值,并将其输入此映射,除非为 null。
1 2 3 4 5 6 7 8 9 10 11 12 13 default V computeIfAbsent (K key, Function<? super K, ? extends V> mappingFunction) { Objects.requireNonNull(mappingFunction); V v; if ((v = get(key)) == null ) { V newValue; if ((newValue = mappingFunction.apply(key)) != null ) { put(key, newValue); return newValue; } } return v; }
如果指定 key 的 value 存在且为非 null,则尝试在给定 key 及其当前映射 value 的情况下计算新映射。如果函数返回 null,则删除映射。如果函数本身抛出异常,则重新抛出异常,并保持当前映射不变。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 default V computeIfPresent (K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) { Objects.requireNonNull(remappingFunction); V oldValue; if ((oldValue = get(key)) != null ) { V newValue = remappingFunction.apply(key, oldValue); if (newValue != null ) { put(key, newValue); return newValue; } else { remove(key); return null ; } } else { return null ; } }
尝试计算指定 key 及其当前映射 value 的映射,如果没有当前映射,则为 null。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 default V compute (K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) { Objects.requireNonNull(remappingFunction); V oldValue = get(key); V newValue = remappingFunction.apply(key, oldValue); if (newValue == null ) { if (oldValue != null || containsKey(key)) { remove(key); return null ; } else { return null ; } } else { put(key, newValue); return newValue; } }
如果指定的 key 尚未与 value 关联或与 null 关联,则将其与给定的非空值关联。否则,将相关 value 替换为给定重映射函数的结果,或者如果结果为 null 则删除。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 default V merge (K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) { Objects.requireNonNull(remappingFunction); Objects.requireNonNull(value); V oldValue = get(key); V newValue = (oldValue == null ) ? value : remappingFunction.apply(oldValue, value); if (newValue == null ) { remove(key); } else { put(key, newValue); } return newValue; }