简介

前面把List基本记录完了,对于集合List,Map,Set,因为Set基于Map,故先记录Map。

这一篇主要记录Map接口及其抽象类(java version:1.8)

整体架构

参考上图,整体分析如下

  1. Map

    映射接口,定义了存储内容为键值对(key-value)及map的基本操作方法

  2. AbstractMap

    该抽象类对Map接口有了整体的实现,简化实现Map接口所需要的工作

  3. SortedMap

    该接口更一步的对key提供了一个排序,该Map通过Comparable针对keys提供了一个自然排序,

    或者在创建时候通过Comparator实现排序

  4. NavigableMap

    在SortedMap接口上拓展了一系列的导航方法

  5. HashMap

    基于hash表实现,key和value都允许null,非同步的且不能保证排序

  6. WeakHashMap

    和HashMap类似,不过它的键是"弱键"

  7. LinkedHashMap

    基于hash表和链表实现,和HashMap不同的是它维护了一个双向链表

  8. TreeMap

    基于红黑树实现,非同步,有序map

  9. Hashtable

    基于hash表,线程安全的,key不允许为null

深入分析接口和抽象类

Map

Map定义:public interface Map<K,V>

Map是一个键值对(key-value)映射接口,key不可重复,每个键至多映射一个值;

Map提供三个视图

  1. 键的Set集合视图
  2. 值得Collection集合视图
  3. 键值对的Set集合视图

Map部分源码


public interface Map&lt;K,V&gt;{
int size();//返回键值对个数
boolean isEmpty();//判断是否为空
boolean containKey(Object key);//判断是否包含key
boolean containsValue(Object value);//判断是否包含value
V get(Object key);//根据key获取value,如果实现类map允许null,对应的key没有映射,返回null
V put(K key, V value);//添加键值对,如果原来map中包含key,返回值为旧值
V remove(Object key);//移除键为key的键值对,如果没有返回null
void putAll(Map&lt;? extends K, ? extends V&gt; m);//添加键值对
void clear();//清空map
Set&lt;K&gt; keySet();//key视图
Collection&lt;V&gt; values();//value视图
Set&lt;Map.Entry&lt;K, V&gt;&gt; entrySet();//键值对视图
interface Entry&lt;K,V&gt;{//保存键值对
K getKey();
V getValue();
V setValue(V value);
}
Set&lt;Map.Entry&lt;K, V&gt;&gt; entrySet();//键值对视图
default V getOrDefault(Object key, V defaultValue) {//@since 1.8 返回键值对key对应的值,如果key没有返回defaultValue
V v;
return (((v = get(key)) != null) || containsKey(key))
? v
: defaultValue;
}
default V putIfAbsent(K key, V value) {//如果键值对key对应的值为null,key对应的值变为value
V v = get(key);
if (v == null) {
v = put(key, value);
} return v;
}
}

AbstractMap

提供了Map接口的骨架实现,对于开发一个不可变的map,开发者只需要继承这个类且提供entrySet方法的实现,

通常entrySet方法返回的Set在AbstractSet上实现,该set不应该支持add()或者remove()方法,并且它的迭代器不支持remove()方法。

要开发一个可变的Map,开发者继承这个类提供entrySet方法的实现外还额外需要put方法,

不然会报UnsupportedOperationException(因为AbstractMap的put方法只是抛出了UnsupportedOperationException,

如果你想开发一个可变的Map,使用put方法是需要重写的);并且entrySet().iterator()返回的迭代器必须实现它的remove方法()

SortedMap

SortedMap接口继承Map接口,为一个有序的键值对映射。

添加到SortedMap的键必须实现Comparable接口或者被指定的comparator接受。此外,所有的key能够相互比较:k1.compareTo(k2)或者

comparator.compare(k1, k2)不能抛出ClassCastException。

其实现类需要提供四个构造函数

  1. 无参构造函数,keys排序按照自然排序
  2. 带有一个 Comparator 类型参数的构造方法,keys按照指定的比较器排序
  3. 带有一个Map类型参数的构造方法,keys按照自然排序,创建的SortedMap与给定的Map具有相同键值对
  4. 带有一个SortedMap类型参数的构造方法,keys按照参数SortedMap的比较器排序,

NavigableMap

NavigableMap扩展了 SortedMap,具有了针对给定搜索目标返回最接近匹配项的导航方法。

方法 lowerEntry、floorEntry、ceilingEntry 和 higherEntry 分别返回与小于、小于等于、大于等于、大于给定键的键关联的 Map.Entry 对象,如果不存在这样的键,则返回 null。

类似地,方法 lowerKey、floorKey、ceilingKey 和 higherKey 只返回关联的键。

所有这些方法是为查找条目而不是遍历条目而设计的。

可以按照键的升序或降序访问和遍历 NavigableMap。

descendingMap 方法返回映射的一个视图,该视图表示的所有关系方法和方向方法都是逆向的。

升序操作和视图的性能很可能比降序操作和视图的性能要好。

subMap、headMap 和 tailMap 方法与名称相似的 SortedMap 方法的不同之处在于:可以接受用于描述是否包括(或不包括)下边界和上边界的附加参数。

任何 NavigableMap 的 Submap 必须实现 NavigableMap 接口。

此接口还定义了 firstEntry、pollFirstEntry、lastEntry 和 pollLastEntry 方法,它们返回和/或移除最小和最大的映射关系(如果存在),否则返回 null。

subMap(K, K)、headMap(K) 和 tailMap(K) 方法被指定为返回 SortedMap,以允许现有 SortedMap 实现能相容地改进为实现 NavigableMap,但鼓励此接口的扩展和实现重写这些方法以返回 NavigableMap。

类似地,可以重写 SortedMap.keySet() 以返回 NavigableSet。

来源:https://blog.csdn.net/Jzedy/article/details/85157358

Java集合-07Map接口及其抽象类的更多相关文章

  1. 【Java基础】接口和抽象类之间的对比

    Java 中的接口和抽象类之间的对比 一.接口 Interface,将其翻译成插座可能就更好理解了.我们通常利用接口来定义实现类的行为,当你将插座上连接笔记本的三角插头拔掉,换成微波炉插上去的时候,你 ...

  2. Java集合Map接口与Map.Entry学习

    Java集合Map接口与Map.Entry学习 Map接口不是Collection接口的继承.Map接口用于维护键/值对(key/value pairs).该接口描述了从不重复的键到值的映射. (1) ...

  3. Java之集合(一)接口及抽象类

    转载请注明源出处:http://www.cnblogs.com/lighten/p/7278655.html 1.前言 从本章开始介绍Java的集合类,这些类主要存在于java.util包下,该系列基 ...

  4. Java中的接口和抽象类(转)

    在面向对象的概念中,我们知道所有的对象都是通过类来描述的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类往往用来表征我们在对问题 ...

  5. java中的接口和抽象类是什么?

    抽象类与接口的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力.abstract c ...

  6. Java基础之接口与抽象类及多态、内部类

    final关键字 被其修饰的类,不能被继承. 被其修饰的方法,不能被覆盖. 被其修饰的变量,是一个常量,不能被修改,所以定义时必须初始化(和C++的const类似). 一般有final,会搭配stat ...

  7. 【转载】JAVA中综合接口和抽象类实现的一种“抽象接口”

    Muscleape个人总结:(这里的抽象接口是指:使用一个抽象类实现一个接口,是两部分结构) 使用一个抽象类直接实现接口,将接口中的方法区分为实现类必须要实现的和选择性实现的,其他需要实现接口的类型通 ...

  8. Java中的接口和抽象类

    接口和抽象类是Java设计中最基本的概念,它们都不能实例化对象,都可以实现多态,也都能用来创建匿名内部类.但实际使用上还有很多的不同. 两者的语法定义不同,对应的设计抽象关系也不同,接口主要是对行为的 ...

  9. Java基础——关于接口和抽象类的几道练习题

    呃,一定要理解之后自己敲!!!这几道题,使我进一步了解了接口和抽象类. 1.设计一个商品类 字段: 商品名称,重量,价格,配件数量,配件制造厂商(是数组,因为可能有多个制造厂商) 要求: 有构造函数 ...

随机推荐

  1. 开始进行lammps手册的学习啦,跟着Manual一边翻译一边做吧!(转载)

    转载自:http://blog.sina.com.cn/s/blog_64813e370100ngsz.html 注明:黄色部分基本上为不懂的部分,红色字体为所做注释 一.各种文件的介绍: 1 in ...

  2. Trie详解

    Trie,又名字典树.单词查找树,可以较高效地实现统计.排序和保存大量的字符串. 顾名思义,Trie是一个树状的结构,按照树型结构来存储字符串,显然是一种以空间换时间的方法.整体上理解和实现都不会很难 ...

  3. centos6.8上安装部署 jhipster-registry

    必备环境:jdk8,git,maven 1.安装nodejs #由于采用编译的方式很容易出现一些意外的惊喜,所以我们这儿直接用yum命令安装 #1.查看nodejs版本(命令中不要加 -y 如果版本不 ...

  4. UnitTest单元测试框架解析【实用篇】

    UnitTest是展开自动化测试的基础——这个框架很重要!首先我们先自己写一个测试类: 1.被测试类 Widthget.py: # coding: utf-8class Widthget: def _ ...

  5. 用 Java 拿下 HTML 分分钟写个小爬虫

    本文适合有 Java 基础知识的人群 本文作者:HelloGitHub-秦人 HelloGitHub 推出的<讲解开源项目>系列,今天给大家带来一款开源 Java 版一款网页元素解析框架- ...

  6. Labview学习之路(三)前面板数值控件

    首先看一下前面板都有什么数值控件(我用的labview是17年的,其他版本可能会有不同) 我个人将他们分成了六个部分 第一部分 这个部分大家很好理解,数值输入数值输出,时间输入和时间输出,这里我们讲一 ...

  7. Shader之溶解效果的几种实现方法

    这里通过 “是否丢弃像素”的2种方法,写2个shader,效果是一样的,也提到了,丢弃某个像素的3种方式. 是否丢弃: 1.通过脚本控制shader变量判断当前是否丢弃像素,需要额外脚本: 2.sha ...

  8. Google Kick Start Round G 2019

    Google Kick Start Round G 2019 Book Reading 暴力,没啥好说的 #include<bits/stdc++.h> using namespace s ...

  9. 下拉列表被flash覆盖的解决方法

    做鼎闻有一段时间了,有的banner轮播图的地方用flash替换的时候,就会导致上面的导航条下拉列表被flash覆盖,找了一段时间没有得到有效的解决方法,后来知道关键是flash的这一属性{ &quo ...

  10. Java的ArrayList实现随机生成N-M之间N个不重复的随机数

    在此之前我使用Java的数组实现了产生N-M之间的不重复的随机数,下面是使用数列ArrayList实现同样的功能,代码如下: /** * 随机生成 N--M,N个不重复随机数 使用ArrayList ...