Map和AbstractMap

xiaoxiao2021-02-28  78

(注:由于手机号验证出了点问题,n6323438的博客将迁移到此)

Map

Map接口有以下的方法: int size() boolean isEmpty() boolean containsKey(key) boolean containsValue(value) V get(key) V put(key,value) //返回之前key连接的value值 V remove(key) void clear() void putAll(Map<? extends K, ? extends V> m) Set<K> keySet(); Collection<V> values(); boolean equals(object) //两个必须为map并且entrySet相同 int hashCode() //map的hashcode应该是entrySet所有entry的hashcode的和 Set<Map.Entry<K, V>> entrySet(); //获取map中所有键值对的集合,这个方法可以访问键值对,其他大部分方法的实现都要调用这个方法

内部接口:Entry<K,V> (可理解为map里面的键值对)   K getKey()   V getValue()   V setValue(V value)   boolean equals(Object o) //两个都是entry并且K V一样才返回true   int hashCode() //应该先获取key value的hashcode(null为0),再按位异或  Entry的static方法: (以下四个方法都是返回用来比较entry的比较器,比较方式不同)   Comparator<Map.Entry<K,V>> comparingByKey()    //比较两个entry的key,key继承Comparable   Comparator<Map.Entry<K,V>> comparingByValue()    //比较两个entry的value,value继承Comparable   Comparator<Map.Entry<K,V>> comparingByKey(Comparator<? super K> cmp)    //比较两个entry的key,使用指定比较器   Comparator<Map.Entry<K,V>> comparingByValue(Comparator<? super V> cmp)    //比较两个entry的value,使用指定比较器

总结来说,Map借口定义了Map应该有什么样的方法,定义内部键值对应该有什么样的方法

AbstractMap implements Map

AbstractMap除了entrySet和put方法沒有实现,其它方法都实现了. 方法:(该方法的注释写在该方法下面) int size() //返回entrySet().size()

boolean containsValue(Object Value) //获取entrySet().iterator() 然后考虑value是否为null,之后在遍历中查看是否有相等的,(注:value可以为null)

boolean containsKey(Object key) //相同

V get(key) //遍历entrySet,key对应的返回entry.getValue(), key可以为null,找不到会返回null

V put(K key, V value) //这个方法沒有实现,抛出UnsupportedOperationException

V remove(Object key) //遍历,找到对应的key,保存key对应的value,删除key-value,返回value. 找不到返回null

void putAll(Map) //遍历传入的map,添加到当前

boolean equals(Object o) //首先检查o是不是自己,之后检查o是不是Map,之后检查size相不相等,最后检查每一个键值对,要求equals都返回true才相等

int hashCode() //就是把所有键值对的hashCode加起来

接下来,定义了两个volatile变量:   transient volatile Set<K> keySet;   transient volatile Collection<V> values; 这两个变量和以下两个方法有关:Set<K> keySet() Collection<V> values() 这两个方法返回键的集合和值的集合 我们开始看keySet()方法,这个方法返回一个Set,这个Set重写了一些方法:   遍历:获得entrySet().iterator(),通过它来遍历   size,isEmpty,clear,contains:这些方法其实都是调用了AbstractMap的方法 对于values()方法,原理是一样的.

因此,当我们对键的集合和值的集合进行操作时,实际上是对这个map进行操作,这个要注意了.

看到这里,我们可以总结: AbstractMap除了entrySet和put方法沒有实现,其他的都实现了,而其他方法的实现都依赖于entrySet返回的键值对集合,后续的Map如果继承AbstractMap,只需要实现键值对的存储方式就行了

AbstractMap内还实现了两个Entry:   SimpleEntry<K,V>: 内部包含key和value两个变量,很简单. 构造方法有两种:1直接传入key,value 2传入一个entry    SimpleImmutableEntry<K,V>:内部的key和value是final的,不可变. 构造方法同上.

转载请注明原文地址: https://www.6miu.com/read-64208.html

最新回复(0)