Map和AbstractMap

来源:互联网 发布:python经典视频教程 编辑:程序博客网 时间:2024/05/22 13:19

(注:由于手机号验证出了点问题,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的,不可变. 构造方法同上.

原创粉丝点击