[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 ...
随机推荐
- Golang中的OO(面向对象)
组合 > 继承 Go中的设计,以为继承的被诟病,所以Golang的设计团队在语言的设计时并没有采用经典的OO模式 那Golang中各个部分是怎么联系到一起的呢 type ReadWriter i ...
- 一篇文章了解_unittest
1. 基本概念 2018年10月7日 星期日 11:39 unittest是python自带的单元测试框架,有时候又被称为"PyUnit",是python版本的JUint实现. 该 ...
- Mysql的下载,安装,远程连接,密码加密规则修改。
第一次接触mysql,,很多地方不懂,出了很多问题.本来应该在Linux系统中安装mysql的,但是奈何各种电脑限制,所以在公司电脑的Windows service R2 系统上装了mysql数据库. ...
- 我要进大厂之大数据MapReduce知识点(2)
01 我们一起学大数据 今天老刘分享的是MapReduce知识点的第二部分,在第一部分中基本把MapReduce的工作流程讲述清楚了,现在就是对MapReduce零零散散的知识点进行总结,这次的内容大 ...
- Windows SMBv3 CVE-2020-0796 漏洞分析和l漏洞复现
0x00 漏洞描述 漏洞公告显示,SMB 3.1.1协议中处理压缩消息时,对其中数据没有经过安全检查,直接使用会引发内存破坏漏洞,可能被攻击者利用远程执行任意代码.攻击者利用该漏洞无须权限即可实现远 ...
- PVE简单迁移虚拟机
工作中有2台PVE节点,但是没有做集群,如果有集群可以很方便的进行迁移.本次迁移的目的是: 目前有一台PVE1节点装的虚机资源使用较多,想迁移某台虚机到另一台PVE2. 1 备份 备份在web页面操作 ...
- Math对象-JavaScript
Math 是一个内置对象,它拥有一些数学常数属性和数学函数方法.Math 不是一个函数对象. Math 用于 Number 类型. Math 的所有属性与方法都是静态的. 属性 Math.E 欧拉常数 ...
- 简单好用的TCP/UDP高并发性能测试工具
工具下载地址: 链接:https://pan.baidu.com/s/1fJ6Kz-mfFu_RANrgKqYiyA 提取码:0pyf 最近测试智能设备的远程的性能,思路主要是通过UDP对IP和端口发 ...
- 【ACwing 100】InDec序列——差分
(题面来自AcWing) 给定一个长度为 n 的数列 a1,a2,-,an,每次可以选择一个区间 [l,r],使下标在这个区间内的数都加一或者都减一. 求至少需要多少次操作才能使数列中的所有数都一样, ...
- Java基础教程——模拟浏览器发送请求
JAVA访问网页 分别测试使用get和post方法访问网页,可以收到服务器的请求,并写入到html文件中. import java.io.*; import java.net.*; import ja ...