java~Map集合整理

Map图

java~Map集合整理

HashMap 是 Java Collection Framework 的重要成员,也是Map族(如下图所示)中
我们最为常用的一种。不过遗憾的是,HashMap是无序的,也就是说,迭代HashMap所得到的元素顺序并不是它们最初放置到HashMap的顺序。HashMap的这一
缺点往往会造成诸多不便,因为在有些场景中,我们确需要用到一个可以保持插入顺序的Map。庆幸的是,JDK为我们解决了这个问题,它为HashMap提供了一个子类
—— LinkedHashMap。虽然LinkedHashMap增加了时间和空间上的开销,但是它通过维护一个额外的双向链表保证了迭代顺序。特别地,该迭代顺序可以是插入顺序,
也可以是访问顺序。因此,根据链表中元素的顺序可以将LinkedHashMap分为:保持插入顺序的LinkedHashMap 和 保持访问顺序的LinkedHashMap,
其中LinkedHashMap的默认实现是按插入顺序排序的。

  • 更直观地,下图很好地还原了LinkedHashMap的原貌:HashMap和双向链表的密切配合和分工合作造就了LinkedHashMap。特别需要注意的是,next用于
    维护HashMap各个桶中的Entry链,before、after用于维护LinkedHashMap的双向链表,虽然它们的作用对象都是Entry,但是各自分离,是两码事儿。

java~Map集合整理
  • 其中,HashMap与LinkedHashMap的Entry结构示意图如下图所示:

java~Map集合整理

SortedMap

SortedMap(java.util.SortedMap)接口是Map的子接口,SortedMap中增加了元素的排序,这意味着可以给SortedMap中的元素排序。

  • NavigableMap
  • TreeMap
  • ConcurrentSkipListMap

java~Map集合整理

SortedMap的子接口,但是 NavigableMap接口中新加了几个SortedSet接口中没有的方法,使导航存储在映射中的键和值成为可能,本文会讲解。
既然是接口,那就必须用到它的实现,java.util包中只有一个实现 java.util.TreeMap ,另外java.util.concurrent包中也有实现,但是本文不讲解

NavigableMap original = new TreeMap();
original.put("1", "1");
original.put("2", "2");
original.put("3", "3");
TreeMap

TreeMap的实现是红黑树算法的实现, 红黑树又称红-黑二叉树,它首先是一颗二叉树,它具体二叉树所有的特性。同时红黑树更是一颗自平衡的排序二叉树。

  • 平衡二叉树必须具备如下特性:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。也就是说该二叉树的任何一个等等子节点,其左右子树的高度都相近。
    java~Map集合整理
  • 红黑树顾名思义就是节点是红色或者黑色的平衡二叉树,它通过颜色的约束来维持着二叉树的平衡。对于一棵有效的红黑树二叉树而言我们必须增加如下规则:

  • 每个节点都只能是红色或者黑色

  • 根节点是黑色
  • 每个叶节点(NIL节点,空节点)是黑色的。
  • 如果一个结点是红的,则它两个子节点都是黑的。也就是说在一条路径上不能出现相邻的两个红色结点。
  • 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

java~Map集合整理
  • 对于红黑二叉树而言它主要包括三大基本操作:左旋、右旋、着色。
  • 左旋转
    java~Map集合整理
  • 右旋转
    java~Map集合整理
SortedMap<string, string> list = new TreeMap<>(); //&#x57FA;&#x4E8E;&#x7EA2;&#x9ED1;&#x6811;&#x7684;&#x5B9E;&#x73B0;&#xFF0C;&#x5728;&#x5355;&#x7EBF;&#x7A0B;&#x6027;&#x80FD;&#x4E0D;&#x9519;.

list.put("a", "1");
list.put("b", "2");
list.put("c", "3");
list.put("d", "4");
SortedMap<string, string> tail = list.tailMap("c");//&#x8FD4;&#x56DE;&#x5927;&#x4E8E;&#x7B49;&#x4E8E;c&#x7684;
Iterator<string> iterator = tail.values().iterator();
while (iterator.hasNext()) {
  System.out.println(iterator.next());
}
</string></string,></string,>
ConcurrentSkipListMap

多线程下使用,支持更高的并发,ConcurrentSkipListMap 的存取时间是log(N),和线程数几乎无关,内部是SkipList(跳表)结构实现。

跳跃表(SkipList)

java~Map集合整理
  1. 多条链构成,是关键字升序排列的数据结构;
  2. 包含多个级别,一个head引用指向最高的级别,最低(底部)的级别,包含所有的key;
  3. 每一个级别都是其更低级别的子集,并且是有序的;
  4. 如果关键字 key在 级别level=i中出现,则,level
ConcurrentSkipListMap<string, string> concurrentSkipListMap = new ConcurrentSkipListMap<>();
String a1 = concurrentSkipListMap.put("zzl", "zhangzhanling");
String a2 = concurrentSkipListMap.put("zzl1", "zhan1");
String a3 = concurrentSkipListMap.put("zzl2", "zhan2");
String a4 = concurrentSkipListMap.put("china", "&#x4E2D;&#x56FD;");
System.out.printf(concurrentSkipListMap.toString());
</string,>

Original: https://www.cnblogs.com/lori/p/16531130.html
Author: 张占岭
Title: java~Map集合整理

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/537749/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringBoot自定义环境变量——EnvironmentPostProcessor

    现有需求是将数据库配置文件中账号密码相关信息分离且加密,用到了SpringBoot中 EnvironmentPostProcessor接口。可以将外部配置文件读取注入系统中。 实现…

    Java 2023年6月9日
    085
  • 邻接表有向图(三)之 Java详解

    邻接表有向图是指通过邻接表表示的有向图。 上面的图G2包含了”A,B,C,D,E,F,G”共7个顶点,而且包含了” 上图右边的矩阵是G2在内存中…

    Java 2023年5月29日
    0105
  • Http协议&状态码

    什么是Http协议 Http协议即超文本传送协议 (HTTP-Hypertext transfer protocol) 。是一个简单的请求-响应协议,它通常运行在TCP之上。 它定…

    Java 2023年6月9日
    095
  • Java8新特性系列-Optional有什么意义?

    Java 8 中有一个称为 Optional 类的新功能,它应该可以解决 NullPointerExceptions。 显然,这些让开发人员感到恼火的程度比我想象的要多。 很明显,…

    Java 2023年6月7日
    066
  • Android 布局及常用属性

    一、常用属性 控件宽度:layout_width wrap_content match_parent 控件高度:layout_height wrap_content match_p…

    Java 2023年6月5日
    084
  • scrapy框架之item与pipelines

    继续以起点小说为例子,我们要做的就是把对象存储到item(类似于一个字典)中,在通过pipelines持久化到txt文件中。之前我们在运行爬虫的后面加”-o 爬虫名称&…

    Java 2023年6月5日
    0109
  • Maven下载安装与配置

    一、Maven下载 官网下载地址:Maven – Download Apache Maven 此处本人选择3.8.8版本。 点击”apache-maven-3.8.8-…

    Java 2023年6月8日
    098
  • springboot整合swagger3.0配置集UI界面优化

    添加pom依赖 //swagger &#x754C;&#x9762;&#x4F18;&#x5316;&#x4F9D;&#x8D56;…

    Java 2023年6月9日
    064
  • 日常白痴_Long类型的除法,保留两位小数

    背景提要 一直除法用的都是/,忘记了这个只能取到整数部分,需要小数的时候就不知道怎么办很基础的东西了,唉! 解决 首先需要获得小数部分,需要除数是Double类型,然后用 Deci…

    Java 2023年6月7日
    092
  • 高性能架构

    上一篇文章 初识架构让我们对架构设计的复杂度考虑有了一定了解,主要有个 高可用、 高性能、 可扩展。但仅仅知道是不够用的,接下来,将从 高性能来进行详细分享 1. 高性能数据库 从…

    Java 2023年6月15日
    081
  • 单例模式–还没从工厂中逃脱出来?看来是注定单身了..

    前言 上次我们聊了聊一个略微重量级的工厂模式,不知道你是否消化完从工厂中逃脱出来了呢?不是我说,今天的单例模式,恰恰好相反了,孤孤单单,看来是注定单身了.. 先来看看单例模式在jd…

    Java 2023年6月5日
    097
  • 制作自己的Docker镜像

    制作镜像有2种方式,一种是容器转换成镜像,另一种是使用dockerfile创建镜像,一般后者更常用。 使用 docker commit命令将容器转换成镜像 docker commi…

    Java 2023年6月7日
    080
  • 自己挖坑自己埋

    谨用于记录自己在设计时由于考虑不周导致的隐患,阿门。 2021-07-19 新近上线了《智能串接》功能,该功能类似于各种工程项目中的quickStart功能,在该模块设计时留下了两…

    Java 2023年6月9日
    073
  • JAVA与C#的区别

    Java和C#都是编程的语言,它们是两个不同方向的两种语言 相同点: 他们都是面向对象的语言,也就是说,它们都能实现面向对象的思想(封装,继承,多态) 区别: 1.c#中的命名空间…

    Java 2023年5月29日
    080
  • win10搜索功能用不了

    这玩意搞了我今天,直接裂开!系统更新根本解决不了 好在查了相关资料才知道,原来微软在 Win10 的更新中,将搜索功能和语音助手 Cortana 进行了拆分,搜索成了一个独立的功能…

    Java 2023年6月16日
    093
  • 多线程 — H2O 生成、交替打印字符串

    现在有两种线程,氧 oxygen 和氢 hydrogen,你的目标是组织这两种线程来产生水分子。存在一个屏障(barrier)使得每个线程必须等候直到一个完整水分子能够被产生出来。…

    Java 2023年5月30日
    084
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球