[JDK8]Map接口与Dictionary抽象类
package java.util;
一、Map接口
接口定义
public interface Map<K,V>
Map是存放键值对的数据结构。map中没有重复的key,每个key最多只能映射一个value。map不允许包含自身引用作为key。Map接口用来代替Dictionary抽象类。
Map接口提供了三种集合视图。map默认顺序是其集合视图迭代器遍历元素的顺序,例如HashMap。TreeMap自定义顺序。
抽象方法
2.1 查询操作
// 返回map中键值对个数。
// 如果map元素个数多于Integer.MAX_VALUE,返回Integer.MAX_VALUE。
int size();
// map中存在键值对,返回true
boolean isEmpty();
// map中存在指定key的映射,返回true。
boolean containsKey(Object key);
// map中存在一个或多个key映射到指定value,返回true。
// 性能可能为O(n),n为元素个数。
boolean containsValue(Object value);
// 获取指定key的映射值
// 通常值存在返回值,值不存在返回null
V get(Object key);
2.2 修改操作
// 向map中插入键值对,若已存在,则更新。
V put(K key, V value);
// 删除map中指定key的键值对。若不存在,返回null。
V remove(Object key);
2.3 对所有元素的操作
// 拷贝map中所有映射到当前map中
// 拷贝过程中,参数map被修改,结果不确定。
void putAll(Map<? extends K, ? extends V> m);
// 删除map中所有映射
void clear();
2.4 集合视图
// 返回map中key的集合视图
Set<K> keySet();
// 返回map中值的集合视图。
Collection<V> values();
// 返回map中entry的集合视图
Set<Map.Entry<K, V>> entrySet();
集合视图依赖于当前map。如果修改map中映射,就会在视图中有所体现。如果在对集合视图迭代的同时修改了map(迭代器自身的操作除外),迭代结果是不确定的。三种集合视图均支持元素的删除,可以通过Iterator.remove、Collection/Set.remove、removeAll、retainAll 和 clear 操作从map中删除对应的键值对。均不支持添加add和addAll操作。
内部接口Entry
entry即键值对,Map.entrySet()返回的就是entry的集合,是获取entry引用的唯一途径。Map.Entry对象只在迭代过程中有效。
interface Entry<K,V> {
// 返回entry的key
K getKey();
// 获取entry的value
V getValue();
// 设定新值
V setValue(V value);
// 比较当前entry与指定对象
boolean equals(Object o);
// 计算当前entry的hashcode
int hashCode();
// 比较器--使用自然排序的key比较Map.Entry
// 1.8增加
public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K,V>> comparingByKey() {
return (Comparator<Map.Entry<K, V>> & Serializable)
(c1, c2) -> c1.getKey().compareTo(c2.getKey());
}
// 比较器--使用自然排序的key比较Map.Entry
// 1.8增加
public static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K,V>> comparingByValue() {
return (Comparator<Map.Entry<K, V>> & Serializable)
(c1, c2) -> c1.getValue().compareTo(c2.getValue());
}
// 比较器--使用给定key比较器比较Map.Entry
// 1.8增加
public static <K, V> Comparator<Map.Entry<K, V>> comparingByKey(Comparator<? super K> cmp) {
Objects.requireNonNull(cmp);
return (Comparator<Map.Entry<K, V>> & Serializable)
(c1, c2) -> cmp.compare(c1.getKey(), c2.getKey());
}
// 比较器--使用给定value比较器比较Map.Entry
// 1.8增加
public static <K, V> Comparator<Map.Entry<K, V>> comparingByValue(Comparator<? super V> cmp) {
Objects.requireNonNull(cmp);
return (Comparator<Map.Entry<K, V>> & Serializable)
(c1, c2) -> cmp.compare(c1.getValue(), c2.getValue());
}
}
2.5 比较和hash
// 比较当前map与给定对象
boolean equals(Object o);
// 获取当前map的哈希值
// 值等于map中每个entry哈希值的和。
int hashCode();
默认方法(1.8增加)
JDK8中增加几个默认方法,默认方法主要针对某些操作的实现,减少代码编写量。默认方法也结合了函数接口和lambda表达式进行实现。需要注意的是,默认方法实现是线程不安全的,并发场景使用需要重写。
[JDK8]Map接口与Dictionary抽象类的更多相关文章
- jdk1.8.0_45源码解读——Map接口和AbstractMap抽象类的实现
jdk1.8.0_45源码解读——Map接口和AbstractMap抽象类的实现 一. Map架构 如上图:(01) Map 是映射接口,Map中存储的内容是键值对(key-value).(02) A ...
- 接口和抽象类的区别,注意JDK8的接口可以有实现。
Java中,抽象类和接口有相似的地方.下面我们就来细说说接口和抽象类的异同. 首先是相同的地方: 1. 接口和抽象类都能定义方法和属性. 2. 接口和抽象类都是看作是一种特殊的类.大部分的时候,定义的 ...
- Java集合中的Map接口
jdk1.8.0_144 Map是Java三种集合中的一种位于java.util包中,Map作为一个接口存在定义了这种数据结构的一些基础操作,它的最终实现类有很多:HashMap.TreeMap.So ...
- 集合框架之Map接口
Map是将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. Map 接口提供三种collection视图,允许以键集.值集或键-值映射关系集的形式查看某个映射的内容.映射顺序定 ...
- Java中的集合(七)双列集合顶层接口------Map接口架构
Java中的集合(七)双列集合顶层接口------Map接口 一.Map接口的简介 通过List接口,我们知道List接口下的集合是单列集合,数据存储是单列的结构.Map接口下是一个键值对(key-v ...
- JAVA ,Map接口 ,迭代器Iterator
1. Map 接口概述 java.util.Map 接口描述了映射结构, Map 接口允许以键集.值集合或键 - 值映射关系集的形式查看某个映射的内容. Java 自带了各种 Map 类. 这些 ...
- JavaSet接口、唯一元素和Map接口整理
Set接口 1.1 HashSet集合存储数据的结构(哈希表) HashSet集合,采用哈希表结构存储数据,保证元素唯一性的方式依赖于:hashCode()与equals()方法. 哈希表底层,使用的 ...
- JAVA中Collection接口和Map接口的主要实现类
Collection接口 Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同的元素 ...
- Java容器Map接口
Map接口容器存放的是key-value对,由于Map是按key索引的,因此 key 是不可重复的,但 value 允许重复. 下面简单介绍一下Map接口的实现,包括HashMap,LinkedHas ...
随机推荐
- Bad magic number ImportError in python
是源码编译里面版本不对,删除掉源码pyc然后重新编译就可以了 find .-name '*.pyc'-delete python -m compileall . 更新历史 why when 创建 20 ...
- 【翻译】指示器(indicator)的分类
参考 David Bianco在2015年发布的博文: http://detect-respond.blogspot.com/2013/07/on-misuse-of-indicators.html ...
- mysql多表查询之子语句查询
1.子语句查询 1.1子语句查询出来的结果集作为临时表名使用 select * from (select * from person) as aaa; -- as这个起别名关键字是可以省略的 1.2查 ...
- Mysql数据安全备份
数据安全备份的意义 在出现意外的时候(硬盘损坏.断点.黑客攻击),以便数据的恢复 导出生产的数据以便研发人员或者测试人员测试学习 高权限的人员那操作失误导致数据丢失,以便恢复 备份类型 完全备份:对整 ...
- HDU100题简要题解(2040~2049)
HDU2040 亲和数 题目链接 Problem Description 古希腊数学家毕达哥拉斯在自然数研究中发现,220的所有真约数(即不是自身的约数)之和为: 1+2+4+5+10+11+20+2 ...
- win10,ubuntu时间不对问题
sudo apt-get install ntpdate sudo ntpdate time.windows.com # ntp2.aliyun.com 然后将时间更新到硬件上: sud ...
- OAuth 2.0授权框架详解
目录 简介 OAuth的构成 refresh Token Authorization Code模式 隐式授权 Resource Owner 授权密码认证 Client 认证授权 github的OAut ...
- Pinpoint 设置微信或者钉钉预警
本文基于 Pinpoint 2.1.0 版本 本文大部分内容来自:侠梦的开发笔记 ,但是原文的版本和我的不一致,放在2.1.0是跑不起来的,但是大概逻辑和思路基本一致. 目录 一.接入预警大概思路 二 ...
- Guitar Pro教程之虚拟吉他功能讲解
上一章节我们讲述了Guitar Pro的组织小节的相关功能,那么本章节我们还是采用图文结合的方式为大家讲解关于{cms_selflink page='index' text='Guitar Pro'} ...
- guitar pro系列教程(二十五):Guitar Pro教程之组织小节
上一章节我们讲述了关于Guitar Pro 7的主界面的相关功能的介绍,对于初学作曲,又是吉他的初学者,刚刚接触Guitar Pro时,很多的功能,符号,工具都市不熟悉的,这样在创作,使用的过程中就会 ...