模块 java.base
 java.util

类 AbstractMap<K,V>

java.lang.Object
java.util.AbstractMap<K,V>
类型参数:
K - 此map维护的键类型
V - 映射值的类型
所有已实现的接口:
Map<K,V>
已知子类:
ConcurrentHashMap , ConcurrentSkipListMap , EnumMap , HashMap , IdentityHashMap , TreeMap , WeakHashMap

public abstract class AbstractMap<K,V> extends Object implements Map <K,V>
此类提供 Map 接口的骨架实现,以最大限度地减少实现此接口所需的工作量。

要实现不可修改的map,程序员只需扩展此类并为 entrySet 方法提供实现,该方法返回map映射的集合视图。通常,返回的集合将依次在 AbstractSet 之上实现。此集合不应支持 addremove 方法,其迭代器不应支持 remove 方法。

要实现可修改map,程序员必须额外覆盖此类的 put 方法(否则会抛出 UnsupportedOperationException ),并且 entrySet().iterator() 返回的迭代器必须额外实现其 remove 方法。

根据 Map 接口规范中的建议,程序员通常应提供 void(无参数)和 map 构造函数。

此类中每个非抽象方法的文档都详细描述了它的实现。如果正在实现的map允许更有效的实现,则可以重写这些方法中的每一个。

此类是 Java 集合框架 的成员。

自从:
1.2
参见:
  • 构造方法详细信息

    • AbstractMap

      protected AbstractMap()
      唯一的构造方法。 (对于子类构造方法的调用,通常是隐式的。)
  • 方法详情

    • size

      public int size()
      返回此map中键值映射的数量。如果map包含超过 Integer.MAX_VALUE 个元素,则返回 Integer.MAX_VALUE
      指定者:
      size 在接口 Map<K,V>
      实现要求:
      此实现返回 entrySet().size()
      返回:
      此map中键值映射的数量
    • isEmpty

      public boolean isEmpty()
      如果此map不包含键值映射,则返回 true
      指定者:
      isEmpty 在接口 Map<K,V>
      实现要求:
      此实现返回 size() == 0
      返回:
      true 如果此map不包含键值映射
    • containsValue

      public boolean containsValue(Object  value)
      如果此map将一个或多个键映射到指定值,则返回 true。更正式地说,返回 true 当且仅当此map包含至少一个映射到值 v 使得 Objects.equals(value, v) 。对于 Map 接口的大多数实现,此操作可能需要与映射大小成线性关系的时间。
      指定者:
      containsValue 在接口 Map<K,V>
      实现要求:
      此实现遍历 entrySet() 搜索具有指定值的条目。如果找到这样的条目,则返回 true。如果迭代终止而没有找到这样的条目,则返回 false。请注意,此实现需要map大小的线性时间。
      参数:
      value - 要测试其在此map中是否存在的值
      返回:
      true 如果此map将一个或多个键映射到指定值
      抛出:
      ClassCastException - 如果该值的类型不适合此map (optional)
      NullPointerException - 如果指定值为空且此map不允许空值 (optional)
    • containsKey

      public boolean containsKey(Object  key)
      如果此map包含指定键的映射,则返回 true。更正式地说,返回 true 当且仅当此map包含键 k 的映射使得 Objects.equals(key, k) 。 (最多可以有一个这样的映射。)
      指定者:
      containsKey 在接口 Map<K,V>
      实现要求:
      此实现迭代 entrySet() 搜索具有指定键的条目。如果找到这样的条目,则返回 true。如果迭代终止而没有找到这样的条目,则返回 false。请注意,此实现需要map大小的线性时间;许多实现将覆盖此方法。
      参数:
      key - 要测试其在此map中是否存在的键
      返回:
      true 如果此map包含指定键的映射
      抛出:
      ClassCastException - 如果键的类型不适合此map (optional)
      NullPointerException - 如果指定的键为空且此map不允许空键 (optional)
    • get

      public V  get(Object  key)
      返回指定键映射到的值,如果此map不包含键的映射,则返回 null

      更正式地说,如果此map包含从键 k 到值 v 的映射,使得 Objects.equals(key, k) ,则此方法返回 v ;否则返回 null 。 (最多可以有一个这样的映射。)

      如果此map允许空值,则 null 的返回值不允许一定指示映射不包含键的映射;map也可能将密钥显式映射到 nullcontainsKey 操作可用于区分这两种情况。

      指定者:
      get 在接口 Map<K,V>
      实现要求:
      此实现迭代 entrySet() 搜索具有指定键的条目。如果找到这样的条目,则返回该条目的值。如果迭代终止而没有找到这样的条目,则返回 null。请注意,此实现需要map大小的线性时间;许多实现将覆盖此方法。
      参数:
      key - 要返回其关联值的键
      返回:
      指定键映射到的值,如果此map不包含键的映射,则返回 null
      抛出:
      ClassCastException - 如果键的类型不适合此map (optional)
      NullPointerException - 如果指定的键为空且此map不允许空键 (optional)
    • put

      public V  put(K  key, V  value)
      将指定值与此map中的指定键相关联(可选操作)。如果map先前包含键的映射,则旧值将替换为指定值。 (据说映射 m 包含键 k 的映射当且仅当 m.containsKey(k) 将返回 true 。)
      指定者:
      put 在接口 Map<K,V>
      实现要求:
      这个实现总是抛出一个 UnsupportedOperationException
      参数:
      key - 与指定值关联的键
      value - 与指定键关联的值
      返回:
      key 关联的先前值,如果没有 key 的映射,则为 null 。 (如果实现支持 null 值,则 null 返回还可以指示之前将 nullkey 相关联的映射。)
      抛出:
      UnsupportedOperationException - 如果此map不支持 put 操作
      ClassCastException - 如果指定键或值的类阻止它存储在此map中
      NullPointerException - 如果指定的键或值是 null 并且此map不允许 null 键或值
      IllegalArgumentException - 如果指定键或值的某些属性阻止它存储在此map中
    • remove

      public V  remove(Object  key)
      如果存在,则从此map中删除键的映射(可选操作)。更正式地说,如果此map包含从键 k 到值 v 的映射使得 Objects.equals(key, k) ,则该map将被删除。 (map最多可以包含一个这样的映射。)

      返回此map先前与键相关联的值,如果map不包含键的映射,则返回 null

      如果此map允许空值,则 null 的返回值不允许一定指示映射不包含键的映射;map也可能将密钥显式映射到 null

      一旦调用返回,map将不包含指定键的映射。

      指定者:
      remove 在接口 Map<K,V>
      实现要求:
      此实现迭代 entrySet() 搜索具有指定键的条目。如果找到这样的条目,则通过其 getValue 操作获取其值,通过迭代器的 remove 操作从集合(和支持map)中删除该条目,并返回保存的值。如果迭代终止而没有找到这样的条目,则返回 null。请注意,此实现需要map大小的线性时间;许多实现将覆盖此方法。

      请注意,如果 entrySet 迭代器不支持 remove 方法并且此map包含指定键的映射,则此实现会抛出 UnsupportedOperationException

      参数:
      key - 要从map中删除其映射的键
      返回:
      key 关联的先前值,如果没有 key 的映射,则为 null
      抛出:
      UnsupportedOperationException - 如果此map不支持 remove 操作
      ClassCastException - 如果键的类型不适合此map (optional)
      NullPointerException - 如果指定的键为空且此map不允许空键 (optional)
    • putAll

      public void putAll(Map <? extends K ,? extends V > m)
      将指定map中的所有映射复制到此map(可选操作)。此调用的效果等同于在指定map中从键 k 到值 v 的每个映射调用一次此map上的 put(k, v) 。如果指定的map在操作过程中被修改,则此操作的行为是未定义的。
      指定者:
      putAll 在接口 Map<K,V>
      实现要求:
      此实现迭代指定map的 entrySet() 集合,并为迭代返回的每个条目调用此map的 put 操作一次。

      请注意,如果此map不支持 put 操作并且指定的map为非空,则此实现会抛出 UnsupportedOperationException

      参数:
      m - 要存储在此map中的映射
      抛出:
      UnsupportedOperationException - 如果此map不支持 putAll 操作
      ClassCastException - 如果指定map中的键或值的类阻止将其存储在此map中
      NullPointerException - 如果指定的map为空,或者如果此map不允许空键或值,并且指定的map包含空键或值
      IllegalArgumentException - 如果指定map中键或值的某些属性阻止它存储在此map中
    • clear

      public void clear()
      从此map中删除所有映射(可选操作)。此调用返回后map将为空。
      指定者:
      clear 在接口 Map<K,V>
      实现要求:
      此实现调用 entrySet().clear()

      请注意,如果 entrySet 不支持 clear 操作,此实现将抛出 UnsupportedOperationException

      抛出:
      UnsupportedOperationException - 如果此map不支持 clear 操作
    • keySet

      public Set <K > keySet()
      返回此map中包含的键的 Set 视图。该集合由map支持,因此对map的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改map(除了通过迭代器自己的 remove 操作),迭代的结果是不确定的。该集合支持元素删除,即通过 Iterator.removeSet.removeremoveAllretainAllclear 操作从map中删除相应的映射。它不支持 addaddAll 操作。
      指定者:
      keySet 在接口 Map<K,V>
      实现要求:
      此实现返回一个集合,该集合是 AbstractSet 的子类。子类的迭代器方法在此map的 entrySet() 迭代器上返回一个“包装对象”。 size 方法委托给该map的 size 方法,contains 方法委托给该map的 containsKey 方法。

      该集合在第一次调用此方法时创建,并返回以响应所有后续调用。不执行同步,因此多次调用此方法可能不会全部返回相同的集合。

      返回:
      此map中包含的键的集合视图
    • values

      public Collection <V > values()
      返回此map中包含的值的 Collection 视图。集合由map支持,因此对map的更改会反映在集合中,反之亦然。如果在对集合进行迭代时修改map(除了通过迭代器自己的 remove 操作),迭代的结果是不确定的。该集合支持元素删除,即通过 Iterator.removeCollection.removeremoveAllretainAllclear 操作从map中删除相应的映射。它不支持 addaddAll 操作。
      指定者:
      values 在接口 Map<K,V>
      实现要求:
      此实现返回一个集合,该集合是 AbstractCollection 的子类。子类的迭代器方法在此map的 entrySet() 迭代器上返回一个“包装对象”。 size 方法委托给该map的 size 方法,contains 方法委托给该map的 containsValue 方法。

      该集合在第一次调用此方法时创建,并返回以响应所有后续调用。不执行同步,因此多次调用此方法可能不会全部返回相同的集合。

      返回:
      此map中包含的值的集合视图
    • equals

      public boolean equals(Object  o)
      比较指定对象与此map是否相等。如果给定对象也是一个映射并且两个映射表示相同的映射,则返回 true。更正式地说,两个映射 m1m2 表示相同的映射,如果 m1.entrySet().equals(m2.entrySet()) 。这可确保 equals 方法在 Map 接口的不同实现中正常工作。
      指定者:
      equals 在接口 Map<K,V>
      重写:
      equals 在类 Object
      实现要求:
      这个实现首先检查指定的对象是否是这个map;如果是这样,它返回 true 。然后,它检查指定的对象是否是一个map,其大小与这个map的大小相同;如果不是,它返回 false 。如果是,它会遍历此map的 entrySet 集合,并检查指定的map是否包含此map包含的每个映射。如果指定的map不包含此类映射,则返回 false。如果迭代完成,则返回 true
      参数:
      o - 要与此map进行相等比较的对象
      返回:
      true 如果指定的对象等于这个map
      参见:
    • hashCode

      public int hashCode()
      返回此map的哈希码值。映射的哈希码定义为映射的entrySet()视图中每个条目的哈希码之和。这确保 m1.equals(m2) 暗示 m1.hashCode()==m2.hashCode() 对于任何两个映射 m1m2,正如 Object.hashCode() 的总合同所要求的那样。
      指定者:
      hashCode 在接口 Map<K,V>
      重写:
      hashCode 在类 Object
      实现要求:
      此实现迭代 entrySet() ,对集合中的每个元素(条目)调用 hashCode() ,并将结果相加。
      返回:
      此map的哈希码值
      参见:
    • toString

      public String  toString()
      返回此map的字符串表示形式。字符串表示形式包含键值映射列表,这些键值映射按映射的 entrySet 视图的迭代器返回的顺序排列,括在大括号 ("{}") 中。相邻映射由字符 ", "(逗号和空格)分隔。每个键值映射呈现为键后跟等号 ("="),然后是关联值。键和值按 String.valueOf(Object) 转换为字符串。
      重写:
      toString 在类 Object
      返回:
      此map的字符串表示形式
    • clone

      protected Object  clone() throws CloneNotSupportedException
      返回此 AbstractMap 实例的浅表副本:键和值本身未被克隆。
      重写:
      clone 在类 Object
      返回:
      这张map的浅表副本
      抛出:
      CloneNotSupportedException - 如果对象的类不支持 Cloneable 接口。覆盖 clone 方法的子类也可以抛出此异常以指示无法克隆实例。
      参见: