即日起在codingBlog上分享您的技术经验即可获得积分,积分可兑换现金哦。

Map与AbstractMap

编程语言 nh632343 9℃ 0评论
本文目录
[隐藏]

1.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 m)


Set keySet();


Collection values();


boolean equals(object) //两个必须为map并且entrySet相同


int hashCode() //map的hashcode应该是entrySet所有entry的hashcode的和


Set> entrySet(); //获取map中所有键值对的集合,这个方法可以访问键值对,其他大部分方法的实现都要调用这个方法

内部接口:Entry (可理解为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> comparingByKey() 


  //比较两个entry的key,key继承Comparable


  Comparator> comparingByValue() 


  //比较两个entry的value,value继承Comparable


  Comparator> comparingByKey(Comparator cmp) 


  //比较两个entry的key,使用指定比较器


  Comparator> comparingByValue(Comparator cmp) 


  //比较两个entry的value,使用指定比较器

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

2.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 keySet;


  transient volatile Collection values;


这两个变量和以下两个方法有关:Set keySet() Collection values()


这两个方法返回键的集合和值的集合


我们开始看keySet()方法,这个方法返回一个Set,这个Set重写了一些方法:


  遍历:获得entrySet().iterator(),通过它来遍历


  size,isEmpty,clear,contains:这些方法其实都是调用了AbstractMap的方法


对于values()方法,原理是一样的.

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

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

AbstractMap内还实现了两个Entry:


  SimpleEntry: 内部包含key和value两个变量,很简单. 构造方法有两种:1直接传入key,value 2传入一个entry


   SimpleImmutableEntry:内部的key和value是final的,不可变. 构造方法同上.

转载请注明:CodingBlog » Map与AbstractMap

喜欢 (0)or分享 (0)
发表我的评论
取消评论

*

表情