Java中的集合(七)双列集合顶层接口------Map接口

一、Map接口的简介

通过List接口,我们知道List接口下的集合是单列集合,数据存储是单列的结构。Map接口下是一个键值对(key-value)的映射接口,Map集合中,不能包含重复的键,每个键只能映射一个值(元素),值可以重复,因此可以根据key快速查找value的值。

(一)、Hash(散列/哈希)的概念

1、hash(哈希)

想要清楚Map的数据结构,哈希是基本概念,我们先来看看什么是哈希?
hash翻译为"散列",也有直接音译为"哈希",就是把任意长度的输入,通过散列算法,变成固定长度的输出,该输出就是散列值。这是一种压缩机制,因为散列值所占用的空间远小于输入值所占的空间,不同的输入可能形成相同的散列值,所以不能通过散列值来确定唯一的输入值。简单来说,hash就是将任意长度消息压缩为固定长度消息摘要的函数。

2、散列表

散列表(hash table 也叫哈希表)是通过关键(key,value)key值直接访问的数据结构。它通过将关键key值映射到表中的位置来访问数据,来加快访问速度,这个映射函数叫做散列函数,存储散列值的数组叫做散列表。

3、拉链法解决冲突

既然我们知道,不同的输入值可能产生相同的散列值,那就产生了冲突问题,针对这个问题,可以使用拉链法解决。解决方式为:将不同输入值产生相同散列值的数据存储在一个单链表中。如果选定的散列表长度为n,也就是a[0,1,2…n-1] 的数组,如果产生的散列值为i,也就将所有输入值存储到以a[i]为头指针的链表中。

4、Map的存储方式

Map是(key,value)形式,每次插入数据时都会调用hashCode()和equals()方法对key进行比较,确保key是唯一的,hashCode()会返回int类型的值,以String为例:

二、Map接口的类图结构

通过结构图可以知道:

1、Map接口是双列集合的顶层接口,以键值对(key-value)的形式存储内容;

2、AbstractMap实现Map接口,实现了Map接口的大部分API,其实现类有TreeMap、HashMap和WeakHashMap;

3、SortedMap继承Map接口,主要用于键值对的排序,通过外部比较器(Comparator)排序;

4、NavigableMap继承SortedMap接口,NavigableMap定义一系列的导航方法;如"获取大于/等于某对象的键值对"、“获取小于/等于某对象的键值对”等等;

5、TreeMap是Map接口的实现类,且实现了NavigableMap接口,是有序的键值对;

6、HashMap是Map接口的实现类,在日常开发中最常用,是无序的键值对;

7、WeakHashMap是Map接口的实现类,其键的类型与其他实现类不同,WeakHashMap的键是“弱键”;

8、Hashtable实现了Map接口,且继承Dictionary抽象类,是无序的键值对,但是是线程安全的;

9、Dictionary抽象类封装了Enumeration接口,Hashtable可以通过numeration接口进行遍历。

三、Map接口的常用API

四、Map接口内部定义的Entry接口

Entry是Map接口内部定义的接口,Entry接口也是键值对,通过Map接口的entrySet()方法获取Entry的键值对集合,从而实现该集合元素对键值对元素的操作。

五、Map接口下的SortedMap接口

SortedMap接口继承Map接口,提供了一个有序的键值对映射。其的排序有两种:自然排序和定制排序;

    • 自然排序:插入SortedMap的自然排序的元素都必须实现Comparable接口;
    • 定制排序:插入SortedMap的定制排序的元素都必须实现Comparator接口。

所以实现了SortedMap接口的自定义类,都应该提供四个构造方法,如TreeMap实现类:

SortedMap常用的API

六、Map接口下的NavigableMap接口

NavigableMap继承SortedMap接口,它是一个有序有导航的键值对映射,具有了为给定搜索目标报告最接近匹配项的导航方法。

NavigableMap分别提供了获取“键”、“键-值对”、“键集”、“键-值对集”的相关方法。

NavigableMap除了继承SortedMap的特性外,它的提供的功能可以分为4类:
1、提供操作键-值对的方法。
  lowerEntry、floorEntry、ceilingEntry 和 higherEntry 方法,它们分别返回与小于、小于等于、大于等于、大于给定键的键关联的 Map.Entry 对象。
  firstEntry、pollFirstEntry、lastEntry 和 pollLastEntry 方法,它们返回和/或移除最小和最大的映射关系(如果存在),否则返回 null。
2、提供操作键的方法。这个和第1类比较类似
        lowerKey、floorKey、ceilingKey 和 higherKey 方法,它们分别返回与小于、小于等于、大于等于、大于给定键的键。
3、获取键集。
        navigableKeySet、descendingKeySet分别获取正序/反序的键集。
4、获取键-值对的子集。

七、Map接口下的AbstractMap抽象类

AbstractMap是Map接口主要的实现类,以最大限度地减少实现此接口所需的工作。定义为抽象类,程序的自定义类可以继承AbstractMap,可以减少重复的编码。

如果要实现不可修改的映射,只需继承此类并提供 entrySet 方法的实现即可,该方法将返回映射的映射关系 Set 视图。通常,返回的 Set 将依次在 AbstractSet 上实现。此 Set 不支持 add() 或 remove() 方法,其迭代器也不支持 remove() 方法。

如果要实现可修改的映射,必须另外重写此类的 put 方法(否则将抛出 UnsupportedOperationException),entrySet().iterator() 返回的迭代器也必须另外实现其 remove 方法。

八、Dictionary抽象类

Dictionary类是Hashtable类的抽象父类, 它将键映射到值。 每个键和每个值都是一个对象。 在任何一个Dictionary对象中,每个键最多与一个值相关联。 给定一个Dictionary和一个键,可以查找关联的元素。
任何非null对象都可以用作键和值。通常,equals实现应该使用equals方法来确定两个键是否相同。

注意:此类已过时。 新的实现应该实现Map接口,而不是扩展这个类。

此类中的API都是抽象方法,由子类实现

九、Enumeration接口

Enumeration(枚举)接口的作用和Iterator类似,只提供了遍历Vector和Hashtable类型集合元素的功能,不支持元素的移除操作。

Enumeration接口定义了从一个数据结构得到连续数据的手段。

Enumeration接口提供了一套标准的方法,由于Enumeration是一个接口,它的角色局限于为数据结构提供方法协议。

注意:该接口的功能由Iterator接口复制。 此外,Iterator还添加了一个可选的删除操作,并具有较短的方法名称。 新的实现应该考虑使用迭代器优先于枚举。

Java中的集合(七)双列集合顶层接口------Map接口架构的更多相关文章

  1. 获取单列集合,双列集合,数组的Stream流对象以及简单操作

    获取流对象 获取单列集合,双列集合,数组的流对象 单列集合获取流对象: 1.java.util.Collection接口中加入了default方法stream()获取流对象,因此其所有实现类均可通过此 ...

  2. (10)集合之双列集合Map,HashMap,TreeMap

    Map中的元素是两个对象,一个对象作为键,一个对象作为值.键不可以重复,但是值可以重复. 看顶层共性方法找子类特有对象. Map与Collection在集合框架中属并列存在 Map存储的是键值对 Ma ...

  3. Java之Map接口(双列集合)

    Map集合概述 现实生活中,我们常会看到这样的一种集合:IP地址与主机名,身份证号与个人,系统用户名与系统用户对象等,这种一一对应的关系,就叫做映射.Java提供了专门的集合类用来存放这种对象关系的对 ...

  4. HashMap -双列集合的遍历与常用的方法

    package cn.learn.Map; /* java.util.Hashtable<k,y> implements Map<k,v> 早期双列集合,jdk1.0开始 同步 ...

  5. JAVA双列集合HashMap

    HashMap 双列集合HashMap是属于java集合框架3大类接口的Map类,   Map接口储存一组成对的键-值对象,提供key(键)到value(值)的映射.Map中的key不要求有序,不允许 ...

  6. java oop 单列 双列 集合, 迭代器 的使用和说明

    一.集合(Collection) (1)集合的由来? 我们学习的是Java -- 面向对象 -- 操作很多对象 -- 存储 -- 容器(数组和StringBuffer) -- 数组 而数组的长度固定, ...

  7. 双列集合Map的嵌套遍历

    双列集合Map的嵌套使用,例如HashMap中还有一个HashMap,这样的集合遍历起来稍微有点儿复杂.例如一个集合:HashMap<Integer,HashMap<String,Inte ...

  8. Day 9:双列集合Map及实现该接口的类的常用方法

    为什么要学双列集合? 因为单列集合无法处理映射关系,会有成对出现的数据 Map接口  如果是实现了Map接口的集合类,具备的特点: 存储的数据都是以键值对的形式存在的,键不可重复,值可以重复 Map接 ...

  9. 双列集合Map

    1.双列集合Map,就是存储key-value的键值对. 2.hashMap中键必须唯一,值可以不唯一. 3.主要方法:put添加数据    getKey---通过key获取数据    keySet- ...

随机推荐

  1. 刷短视频看新闻看小说也能赚钱的几款APP

    一.抖音极速版 发啦! 刷短视频也能赚钱 第1步:下载[抖音极速版] 第2步:填我邀请码[831008243] 第3步:立刻提现最高[38元]红包 二.今日头条极速版 1元现金速撸 下载[今日头条极速 ...

  2. python基础的一些题目

    第一部分: 第二部分: 第三部分:

  3. STM32 串口USART DMA方式发送接收数据

    硬件:stm32f103cbt6 软件:STM32F10x_StdPeriph_Lib_V3.5.0 文章目录 头文件 USART3_DR的地址 DMA的通道 DMA的中断 USART接收回调函数 头 ...

  4. P2220 [HAOI2012]容易题(快速幂)

    Describe 为了使得大家高兴,小Q特意出个自认为的简单题(easy)来满足大家,这道简单题是描述如下: 有一个数列A已知对于所有的A[i]都是1~n的自然数,并且知道对于一些A[i]不能取哪些值 ...

  5. Spring Boot定时任务运行一段时间后自动关闭的解决办法

    用Spring Boot默认支持的 Scheduler来运行定时任务,有时在服务器运行一段时间后会自动关闭.原因:Schedule默认是单线程运行定时任务的,即使是多个不同的定时任务,默认也是单线程运 ...

  6. linux --自已的域名无法登陆机器的解决办法:同步时间

    昨天发现自己的域名无法访问host了,因此我们测试环境便无法安装,显示SSH not connectted ,随后发现时间不同步: 因此以下命令可以实现时间同步: /opt/quest/bin/vas ...

  7. delete old data in elasticsearch

    delete old data in elasticsearch 0.正文. 其实很简单,就是用他的rest api 发一个delete 请求到 localhost:9200/[indices] [i ...

  8. protus中出现invalid internal memory size ==NULL

    点击8086芯片,更改internal memory size的大小为0x10000

  9. 4.4 Go goto continue break

    4.4 Go goto continue break Go语言的goto语句可以无条件的跳转到指定的代码行执行. goto语句一般与条件语句结合,实现条件转义,跳出循环体等. Go程序不推荐使用got ...

  10. Python一切皆是对象,但这和内存管理有什么关系?

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python的第15篇文章,我们来聊聊Python中内存管理机制,以及循环引用的问题. Python的内存管理机制 对于工程师而言,内 ...