(注:由于手机号验证出了点问题,n6323438的博客将迁移到此)
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除了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的,不可变. 构造方法同上.