Module java.base
Package java.util

Class AbstractMap<K,V>

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

public abstract class AbstractMap<K,V> extends Object implements Map<K,V>
此类提供了Map接口的骨架实现,以最小化实现此接口所需的工作量。

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

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

程序员通常应根据Map接口规范中的建议提供一个无参和映射构造函数。

此类中每个非抽象方法的文档详细描述了其实现。如果正在实现的映射允许更有效的实现,则可以覆盖这些方法中的每一个。

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

自 JDK 版本:
1.2
参见:
  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static class 
    一个维护键和值的条目。
    static class 
    一个不可修改的维护键和值的条目。

    Nested classes/interfaces declared in interface java.util.Map

    Map.Entry<K,V>
  • Constructor Summary

    Constructors
    Modifier
    Constructor
    Description
    protected
    唯一构造函数。
  • Method Summary

    Modifier and Type
    Method
    Description
    void
    clear()
    从此映射中删除所有映射(可选操作)。
    protected Object
    clone()
    返回此AbstractMap实例的浅拷贝:键和值本身不会被克隆。
    boolean
    如果此映射包含指定键的映射,则返回true
    boolean
    如果此映射将一个或多个键映射到指定值,则返回true
    boolean
    将指定对象与此映射进行比较以检查相等性。
    V
    get(Object key)
    返回指定键映射到的值,如果此映射不包含键的映射,则返回null
    int
    返回此映射的哈希码值。
    boolean
    如果此映射不包含键-值映射,则返回true
    Set<K>
    keySet()
    返回此映射中包含的键的Set视图。
    V
    put(K key, V value)
    在此映射中将指定键与指定值关联(可选操作)。
    void
    putAll(Map<? extends K,? extends V> m)
    将指定映射中的所有映射复制到此映射中(可选操作)。
    V
    remove(Object key)
    如果存在,则从此映射中删除键的映射(可选操作)。
    int
    size()
    返回此映射中键-值映射的数量。
    返回此映射的字符串表示形式。
    values()
    返回此映射中包含的值的Collection视图。

    Methods declared in class java.lang.Object

    finalize, getClass, notify, notifyAll, wait, wait, wait
  • Constructor Details

    • AbstractMap

      protected AbstractMap()
      唯一构造函数。(通常由子类构造函数隐式调用。)
  • Method Details

    • size

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

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

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

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

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

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

      如果此映射允许空值,则返回null的返回值不一定表示映射不包含键的映射;也可能是映射明确将键映射到null。可以使用containsKey操作来区分这两种情况。

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

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

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

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

      如果此映射允许null值,则null的返回值不一定表示映射不包含键的映射;也有可能映射明确将键映射到null

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

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

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

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

      public void putAll(Map<? extends K,? extends V> m)
      将指定映射中的所有映射复制到此映射(可选操作)。此调用的效果等效于在此映射上为指定映射中的每个从键k到值v的映射调用put(k, v)。如果在操作进行中修改了指定映射,则此操作的行为是未定义的。如果指定映射具有定义的遇到顺序,则其映射的处理通常按照该顺序进行。
      指定由:
      putAll 在接口 Map<K,V>
      实现要求:
      此实现遍历指定映射的entrySet()集合,并为迭代返回的每个条目调用此映射的put操作。

      请注意,如果此映射不支持put操作且指定映射非空,则此实现将抛出UnsupportedOperationException

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

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

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

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

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

      第一次调用此方法时将创建集合,并在所有后续调用中返回。不执行同步,因此有轻微的可能性,多次调用此方法将不会返回相同的集合。

      返回:
      包含在此映射中的键的集合视图
    • values

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

      第一次调用此方法时将创建集合,并在所有后续调用中返回。不执行同步,因此有轻微的可能性,多次调用此方法将不会返回相同的集合。

      返回:
      包含在此映射中的值的集合视图
    • equals

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

      public int hashCode()
      返回此映射的哈希码值。映射的哈希码定义为映射的entrySet()视图中每个条目的哈希码之和。这确保了m1.equals(m2)意味着对于任何两个映射m1m2m1.hashCode()==m2.hashCode(),这是Object.hashCode()的一般契约要求。
      指定者:
      hashCode 在接口 Map<K,V>
      覆盖:
      hashCode 在类 Object
      实现要求:
      此实现迭代entrySet(),对集合中的每个元素(条目)调用hashCode(),并将结果相加。
      返回:
      此映射的哈希码值
      参见:
    • toString

      public String toString()
      返回此映射的字符串表示形式。字符串表示形式由映射的entrySet视图的迭代器返回的键-值映射列表组成,用大括号("{}")括起来。相邻的映射由字符", "(逗号和空格)分隔。每个键-值映射都以键后跟等号("=")后跟相关值的形式呈现。键和值将被转换为字符串,如String.valueOf(Object)所示。
      覆盖:
      toString 在类 Object
      返回:
      此映射的字符串表示形式
    • clone

      protected Object clone() throws CloneNotSupportedException
      返回此AbstractMap实例的浅拷贝:键和值本身不会被克隆。
      覆盖:
      clone 在类 Object
      返回:
      此映射的浅拷贝
      抛出:
      CloneNotSupportedException - 如果对象的类不支持Cloneable接口。覆盖clone方法的子类也可以抛出此异常,以指示实例无法被克隆。
      参见: