JDK17源码系列-Map源码解读

JDK17 Map源码解读

  1. Map 替代了字典类,它是存储Key-Value类型数据集合的根接口 。
  2. Map中的接口
  • int size()
    返回集合Map中实际存储键值对的数据的大小,如果存储的实际数量大小超出了Integer.MAX_VALUE, 则返回Integer.MAX_VALUE(2147483647)。
  • boolean isEmpty()
    如果集合Map中没有存储Key-Value数据,则返回True,否则返回False。
  • boolean containsKey(Object key)
    如果集合Mao中可以找到指定的Key,则返回True, 否则返回False (对于是如何比对Map
    中是否存在指定的Key,则是通过调用Objects.equal(key, k))。
  • boolean containsValue(Object value)
    如果集合Map中可以找到指定的value,则返回True,否则返回False。(对于是如何比对Map
    中是否存在指定的Key,则是通过调用Objects.equal(value, v))。
  • V get(Object key)
    通过匹配指定的key查找对应的value, 如果可以匹配上,则返回对相应的value, 如果匹配不上,则返回null。
  • V put(key, value)
    向集合Map中存放key-value数据, 如果Map中已经包含了指定的key, 则将新的指定的value替换原有的value。
  • V remove(Obejct key)
    通过匹配Map中指定的key,删除对应的value, 如果可以匹配上,则删除对应的key-value数据,并返回对应的value,如果匹配不上,则返回null。
  • void putAll(Map<? extends k, ? extends v> m)
    将指定的集合m一次性的存储到集合Map中,实际还是将集合中m的key与原集合中的key进行一一比对, 如果集合m中的key在原集合中已经存在,则集合m中对应的value覆盖原集合的value,如果集合m中的key在原集合中不存在, 则原集合进行put操作。
  • void clear()
    清空集合中的数据,清空之后,集合变成空的。
  • Set keySet()
    返回集合Map中所有的key。
  • Collection values()
    返回集合Map中存储的所有value。
  • Set<Map.Entry<K, V>> entrySet();
    返回集合Map中的Entry集合。
  • boolean equals(Object o)
    比较集合Map与指定的对象o是否是同一个集合, 如果是,返回True, 否则,返回False(这主要是通过m1.entrySet().equals(m2.entrySet()进行比较)。
  • int hashCode()
    返回当前集合的哈希码值(这个哈希码值是集合中每一个Entry的哈希码值的总和)。
  • default V getOrDefault(Object key, V defaultValue)
    返回集合中指定的key对应的value, 如果没有指定的key,则返回defaultValue
  • default void replaceAll(BiFunction<? super K, ? super V, ? extends V> function)
    使用指定的function 替换原有集合中每一个entry中的value值。
  • default V putIfAbsent(K key, V value)
    判断集合中指定的key是否已经绑定了value,如果没有绑定,则使用value进行绑定,并且返回null,
    否则返回已经绑定的值。
  • default boolean remove(Object key, Object value)
    当集合中存在与value匹配的项时,删除集合中包含指定key的entry。
  • default boolean replace(K key, V oldValue, V newValue)
    当集合中指定key映射的value与oldValue相等时, 则将指定key的value替换为newValue。
  • default V replace(K key, V value)
    当集合中包含指定的key,并且指定的key对应的value不等于null,则将集合中指定的key对应的value替换为现在的value。
  • default V computeIfAbsent(K key, Function<? super key, ? extends V> mappingFunction)
    如果指定的键尚未与值关联(或映射为null),则尝试使用给定的映射函数计算其值,并将其输入到此映射中,除非为null。
    如果映射函数返回null,则没有记录映射。如果映射函数本身抛出(未检查的)异常,则该异常被重新抛出,并且不记录映射。最常见的用法是构造一个新对象作为初始映射值或记忆结果。
  • default V merge(K key, V value,BiFunction<? super V, ? super V, ? extends V> remappingFunction)
    如果指定的键尚未与值关联或与null关联,则将其与给定的非空值关联。否则,用给定重新映射函数的结果替换关联值,如果结果为空则删除关联值。当为一个键组合多个映射值时,可能会使用此方法。例如,要创建或追加一个String msg到一个值映射:map.merge(key,msg,String::concat)如果重映射函数返回null,则删除映射。如果重新映射函数本身抛出(未检查的)异常,则该异常将被重新抛出
  • static <K, V> Map<K, V> of()
    仅同包其他类可访问,子类无法访问,它返回一个包含0的不可修改的map
  • static <K, V> Map<K, V> of(K k1, V v1)~ static <K, V> Map<K, V> of(K k1, V v1, K k2, V v2,…K10, V10)
    返回一个包含单个键值对到十个键值对的不可修改的Map,相当于Map常量
  • static <K, V> Map<K, V> ofEntries(Entry<? extends K, ? extends V>… entries)
    返回一个不可修改的映射,其中包含从给定项提取的键和值。条目本身不存储在映射中
    使用方式:Map<Integer, String> map = Map.ofEntries(entry(1, “a”),entry(2, “b”),…entry(26, “z”))
  1. Map的内部接口

interface Entry<K,V>{}
1.K getKey()
返回此条目的键
2.V getValue()
返回此条目的值
3. V setValue(V value)
如果映射已经从map中移除(通过迭代器的remove操作),则此调用的行为是未定义的。
4. boolean equals(Object o)
比较两个条目是否相同,两个条目相等的条件是
(e1.getKey()==null ? e2.getKey()==null : e1.getKey().equals(e2.getKey())) && (e1.getValue()==null ? e2.getValue()==null : e1.getValue().equals(e2.getValue()))
5. int hashCode()
获取条目的哈希码值,计算方式为
(e.getKey()==null ? 0 : e.getKey().hashCode()) ^ (e.getValue()==null ? 0 : e.getValue().hashCode())
6. public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K, V>> comparingByKey()
返回Map的比较器。按自然顺序将Key排序。返回的比较器是可序列化的,并且在将条目与空键进行比较时抛出NullPointerException
7. public static <K, V> Map.Entry<K, V> copyOf(Map.Entry<? extends K, ? extends V> e)
返回给定Map.Entry的副本。返回的实例不与任何映射关联。返回的实例具有与Map::entry方法返回的实例相同的特征。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值