map几种实现及其简介(代码片段)

coderDu coderDu     2022-11-04     698

关键词:

前言

本文主要介绍TreeMap、HashMap、LinkedHashMap和ConcurrentHashMap。他们之间的大致关系如下图所示:
技术分享图片

这四种Map各自的特点如下:

  • HashMap作为编程的首选项,速度最快;
  • LinkedHashMap 取“键值对”的顺序是其插入的顺序,速度比HashMap慢一点,但是遍历迭代的速度更快;
  • TreeMap 基于红黑树的实现,所得到的结果可以经过自定义的排序类进行排序,含有获取子树的方法;
  • ConcurrentHashMap 线程安全的Map;

Map中键必须是唯一的,值可以重复,如果键值与或者是根据自定义的“比较类”在逻辑上是相同大小,则会覆盖前一个值

1.SortedMap/TreeMap

SortedMap是基于红黑树的实现,如右图所示,TreeMap使其唯一的实现类,使用SortedMap可以确保键处于排序的状态,其特性如下:

  • Comparator类作为构造器参数,重载其compare(obj1,obj2)方法自定义排序方式;
  • T firstKey()和 T lastKey()返回当前有序的Map第一个和最后一个键;
  • SortedMap subMap(fromKey,toKey);SortedMap headMap(toKey); SortedMap tailMap(fromKey)生成Map的子集/子树,分别指定了起始key值、指定起始值、指定结束值;

重申:如果键值与或者是根据自定义的“比较类”在逻辑上是相同大小,则会覆盖前一个值

public class TreeMapDemo 
    public static void main(String[] args) 
        TreeMap<Integer,String> linkedMap=new TreeMap<>(
                new Comparator<Integer>() //与key类型对齐
                    @Override//根据参数o1与参数o2比较大小返回正、0、负,小的在前边;
                    public int compare(Integer o1, Integer o2) 
                        return Math.abs(o1-2)-Math.abs(o2-2);
                    
                
        );
        linkedMap.put(1,"du");
        linkedMap.put(2,"gen");
        linkedMap.put(3,"kui");//因为根据自定义的比较类,3和1在逻辑上是大小的(距离2),因此会覆盖(1,“du");
        linkedMap.put(1,"gen");
        System.out.println(linkedMap);//输出顺序为从小到大
    
2.LinkedHashMap

LinkedHashMap有如下特点:

  • 速度比Hash稍微慢,但是遍历迭代的速度比HashMap块;
  • 以元素插入的顺序打印元素,但是
  • 可以在构造器中设置是否采用基于访问的“最近最少使用算法LRU”,即get(key)最少的元素使用默认方式打印时放在最前边;

示例代码如下:

public class LinkedHashMapDemo 
    public static void main(String[] args) 
        //沟槽参数分别是初始化容量、装载因子和是否开启LRU
        LinkedHashMap<Integer,String> linkedMap=new LinkedHashMap<>(10,0.75f,true);
        linkedMap.put(1,"du");
        linkedMap.put(2,"gen");
        linkedMap.put(3,"kui");
        System.out.println(linkedMap);//以装载方式打印

        linkedMap.get(2);
        System.out.println(linkedMap);//可以看到被访问的元素靠后打印了
    

linuxpidnamespace简介及其引发的问题(代码片段)

...隔离某种资源。通过命名空间,linux可以支持容器的实现。这里只关注PIDNamspace。PIDnamespa 查看详情

linuxpidnamespace简介及其引发的问题(代码片段)

...隔离某种资源。通过命名空间,linux可以支持容器的实现。这里只关注PIDNamspace。PIDnamespa 查看详情

卡尔曼滤波简介及其算法实现代码(c++/c/matlab)(代码片段)

转载自http://www.matlabsky.com/thread-30399-1-1.htmlopencv2+中也有卡尔曼的例子,不过是对一维点的预测,通过这篇文章对卡尔曼又重新认识了,强大啊|||卡尔曼滤波器简介 近来发现有些问题很多人都很感兴趣。所以在这里... 查看详情

springsecurity简介及其入门案例(代码片段)

文章目录SpringSecurity概念实现原理验证和授权的过程及本质主要过滤器核心组件简介入门案例引入依赖好,入门了,牛了你就SpringSecurity概念官网介绍:https://spring.io/projects/spring-security/SpringSecurity是一个能够为基于Sprin... 查看详情

map简介(代码片段)

Map(映射)一.Map<K,V>Map是映射的顶级接口,实现类主要有:HashMap(重点)HashTable(面试)。特点:将键映射到值的对象(键值对)键唯一,值不唯一。即一个键只能映射一个值,一个值可以对应多个键。键值对在map中以entry结构... 查看详情

音频处理loudnessnormalization响度均衡算法简介(代码片段)

系列文章目录DelayLine简介及其C/C++实现LFO低频振荡器简介及其C/C++实现【音效处理】Delay/Echo算法简介【音效处理】Vibrato算法简介【音效处理】Reverb混响算法简介【音效处理】Compressor压缩器算法简介【音频处理】FastCon... 查看详情

springmvc简介及其快速入门搭建项目(代码片段)

...C的简介(一)SpringMVC概述SpringMVC是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于SpringFrameWork的后续产品,已经融合在SpringWebFlow中。SpringMVC已经成为目前最主流的MVC框架之一,并且随着Sp... 查看详情

springmvc简介及其快速入门搭建项目(代码片段)

...C的简介(一)SpringMVC概述SpringMVC是一种基于Java的实现MVC设计模型的请求驱动类型的轻量级Web框架,属于SpringFrameWork的后续产品,已经融合在SpringWebFlow中。SpringMVC已经成为目前最主流的MVC框架之一,并且随着Sp... 查看详情

音频处理fastconvolution快速卷积算法简介(代码片段)

系列文章目录DelayLine简介及其C/C++实现LFO低频振荡器简介及其C/C++实现【音效处理】Delay/Echo算法简介【音效处理】Vibrato算法简介【音效处理】Reverb混响算法简介【音效处理】Compressor压缩器算法简介文章目录系列文章... 查看详情

hashmap简介以及hashcode写法的建议(代码片段)

...通过key直接获取value,就像查字典一样。JDK中,Map有两种实现方式,一是散列技术,二是红黑树。常见的Map实现HashMap通过散列技术实现。Map中的key对象必须定义equals以及hashCode方法。该容器的访问效率很高,几乎等同于数 查看详情

java数据结构与算法-map和set以及其实现类(代码片段)

...#64;Map方法演示2>Set常用方法@Set方法演示4、Map和Set的实现类概述三、TreeMap和TreeSet1、TreeMap和TreeSet的性质1>`底层结构:`2>`有序性:`3>`可比较:`2、TreeMap以Student的name作为比较四、HashMap和Ha... 查看详情

遍历map的几种方式(代码片段)

Java代码 Map<String,String>map=newHashMap<String,String>();map.put("username","qq");map.put("passWord","123");map.put("userID","1");map.put("email","[email protected]"); 第一种用f 查看详情

java集合-07map接口及其抽象类

...map的基本操作方法AbstractMap该抽象类对Map接口有了整体的实现,简化实现Map接口所需要的工作SortedMap该接口更一 查看详情

33map简介(代码片段)

...除了Collection之外,常用的集合还有Map接口,里面常用的实现类图如下:map中的元素是以键-值的方式存在的,通过键可以获取到值,键是不可以重复的,跟地图比较像,通过一个坐标就可以找到具体的位置。packagecom.sutaoyu.Map;impor... 查看详情

linuxpidnamespace简介及其引发的问题(代码片段)

...隔离某种资源。通过命名空间,linux可以支持容器的实现。这里只关注PIDNamspace。PIDnamespace引入PIDNamespace之前,Linux系统上进程的PID是全局唯一的。同一个系统上,不会存在两个相同PID的正在运行的进程。引入PIDNamespace... 查看详情

机器翻译注意力机制及其pytorch实现(代码片段)

...面阐述注意力理论知识,后面简单描述PyTorch利用注意力实现机器翻译EffectiveApproachestoAttention-basedNeuralMachineTranslation简介Attention介绍在翻译的时候,选择性的选择一些重要信息。详情看这篇文章 。本着简单和有效的原则,本... 查看详情

anacondapycharm的简介和使用(代码片段)

...件包及其依赖,并能够在不同的环境之间切换简而言之,实现Python不同版本之间的切换。二、Anaconda的安装和使用:1.安装按照步骤一步步进行,记得将anaconda加入 查看详情

list中放map的几种方式(代码片段)

packageTest;importjava.util.*;publicclassTestpublicstaticvoidmain(String[]args)//第一种:直接加入List<Map<String,Object>>list1=newArrayList<Map<String,Object>>();Map<String,Object 查看详情