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的,不可变. 构造方法同上.
- Map和AbstractMap
- Map和AbstractMap
- Map接口和AbstractMap抽象类详解
- java 集合框架 Map-AbstractMap
- AbstractMap
- AbstractMap
- 一个效率低下的Map实现:AbstractMap
- Map深入学习(二)AbstractMap
- Java集合类Map之Map与AbstractMap
- 为什么HashMap继承了AbstractMap还要实现Map接口
- HashMap既然继承了AbstractMap为什么还要实现Map
- Java常见集合框架(十九): Map之Map、AbstractMap、HashMap
- AbstractMap 源代码
- AbstractMap equals方法分析
- Java集合之AbstractMap
- map和map.entry
- 享元模式-AbstractMap结构
- JDK源码阅读之AbstractMap
- Spring4第二讲学习笔记,配置文件详解
- Intellij IDEA 下插件MyBatisCodeHelper
- 运用RadioButton实现图片浏览?
- python--函数基本功能
- 生成n个不重复的随机数 java
- Map和AbstractMap
- opencv访问图像像素及简单应用
- JAVA从基础到精通(包装类)
- [bzoj3130][Sdoi2013]费用流 二分+最大流
- progressBar(进度条)
- Codeforces Round #418 (Div. 2) C. An impassioned circulation of affection(尺取)
- 【Python】9“切片和迭代“
- 前端问题总结
- 进度条UIProgressView和计步器结合