当前位置: 首页 > 编程日记 > 正文

Map的分类和不同的应用场景

java为数据结构中的映射定义了一个接口java.util.Map;
它有四个实现类,分别是HashMapHashtableLinkedHashMapTreeMap

可能很多人只使用过HashMap,但还是那句话,你可以不用,但你不能不懂。如果你也是这样,恭喜你发现了宝藏。

首先是这个原始天尊-Map

Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。

1. 大徒弟HashMap

Hashmap是一个最常用的Map,它根据键的HashCode值存储数据根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。HashMap最 多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。

2. 守边疆的Hashtable(只忠心一主,线程安全)

Hashtable与HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtable在写 入时会比较慢。

3. 循规蹈矩的LinkedHashMap

LinkedHashMap是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历

LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量 很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

4. 爱算账的TreeMap

TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。

在整个M国,四位徒弟分管不同部门,各司其职,各有优缺

一般情况下, 我们用的最多的是HashMap,在Map中插入、删除和定位元素,HashMap是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会 更好。如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列。

HashMap是一个 最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条 记录的键为NULL,允许多条记录的值为NULL。

HashMap不支持线程同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致性。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。


Hashtable与HashMap类似,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtable在写入时会比较慢。


LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。


在遍历的时候会比HashMap慢TreeMap能够把它保存的记录根据键排序,默认是按升序排序,也可以指定排序的比较器。当用lterator遍历TreeMap时,得到的记录是排过序的。

相关文章:

sql特殊字符转义,oracle中将字符 ‘ 转义

oracle中使用sql语句或多或少地会遇到使用特殊字符,比如" ’ ",这时,这个单引号就会与前面的单引号匹配,将文本从中间断开,引发问题和错误。这就需要我们进行转义。 而oracle中并不像C java这些编程语言那样使用"…

idea中如何打开RunDashboard窗口,微服务最实用设置

idea中如何打开RunDashboard窗口 找到.idea目录&#xff0c;打开workspace.xml&#xff0c;搜索RunDashboard&#xff0c;找到该段配置&#xff0c;加入下面注释中的代码 <component name"RunDashboard"><option name"ruleStates"><list&…

在js中使用HashMap数据结构,在js中使用K,V数据结构

首先是定义一个HashMap方法&#xff0c;做基类(复制在js中即可&#xff0c;然后引用) //简单的哈希表,begin function HashMap() {/** Map 大小 * */var size 0;/** 对象 * */var entry new Object();/** 存 * */this.put function(key, value) {if (!this.containsKey(key…

查看Hotspot源码,查看java各个版本源码的网站,如何查看jdk源码

java开发必知必会之看源码&#xff0c;而看源码的第一步则是找到源码&#x1f447; jdk源码网站&#xff1a;http://hg.openjdk.java.net/ 进入这个网站后并不是源码摆在面前&#xff0c;根据下面以jdk8为例&#xff0c;学会如何查看各个版本内容的jdk源码。 这里我们举例的是…

快起床刷题去,别人把你offer拿走啦

好久没有上力扣刷题咯&#xff0c;又到了关键的时刻&#xff0c;却忘得零零散散&#xff0c;囧~ 话说&#xff0c;刷题、学算法、常用&#xff0c;这些技能才能长在身上! 上一道刚刚遇到的正菜~ 题&#xff1a;给定一个整数数组 nums 和一个目标值 k&#xff0c;请实现一个方…

oracle 提示:ORA-02292:integrity constraint(xxxxxxx) violated - child record found

当我们删除 数据的时候 oracle 提示:ORA-02292:integrity constraint(xxxxxxx) violated - child record found 这种情况呢是因为外键关联的存在&#xff0c;需删除另一个表的信息后才能将该信息删除。 这种情况首先应该去寻找是否有表与当前表存在关联&#xff0c;若能找到最…

分割数组(将数组三等分)

简单面试题——分割数组 时间复杂度O(n) //输入&#xff1a;一个自然数数组&#xff0c;选取其中2个数字num[i], num[j], 把数组三分&#xff0c; // 每一部分的累加和&#xff08;不包括分割点的数字&#xff09;相等。 // 例&#xff1a;nums[] [2,1,3,1,1,1,5,3]&am…

svn和git的本质区别是什么

上边图中,跨越了区的箭头,它中间的区数据都会同步。例如:git checkout ,它是将本地仓库数据更新到暂存区和工作区的。

使用JavaScript实现复杂功能:一个完整的电商网站搜索功能

随着互联网的发展,电子商务网站已经成为人们购物的重要平台。而在这些网站中,搜索功能无疑是核心功能之一。用户可以通过搜索快速找到他们需要的商品,从而提高购物体验。本文将详细介绍如何使用JavaScript实现一个完整的电商网站搜索功能。

牛年前的一小结——打响本命年的第一枪,继续刷题!

经过一段时间的小尝试&#xff0c;摸索出了一点点头儿吧。 总结一下子。 关于面试的java&#xff0c;像我这个经验层次&#xff08;1-2year普通厂&#xff09;的都不会太难。最多超不出力扣中等难度。 多练习链表、树、指针类的比较基础的题目&#xff1b;有解题方法并不是最重…

力扣1002.查找常用字符

力扣 1002. 查找常用字符 本人力扣练习已上传至码云&#xff0c;可互相学习借鉴。 难度-简单 题目&#xff1a; 给定仅有小写字母组成的字符串数组 A&#xff0c;返回列表中的每个字符串中都显示的全部字符&#xff08;包括重复字符&#xff09;组成的列表。例如&#xff0c;…

springboot项目使用junit4进行单元测试,maven项目使用junit4进行单元测试

首先&#xff0c;maven项目中引入依赖 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope> </dependency><dependency><groupId>org.…

springboot设置文件上传大小(tomcat默认1M)

application.yml # 设置文件上传大小&#xff08;tomcat默认1M&#xff09; server:tomcat:max-http-form-post-size: -1 spring:servlet:multipart:max-file-size: 100MBmax-request-size: 500MB

kotlin重写构造方法编译报错:Primary constructor call expected

在kotlin中使用construct关键字定义构造方法&#xff0c;如果类定义时已经有构造方法&#xff08;类名后带括号&#xff09;&#xff0c;需要添加构造方法时&#xff0c;需要使用以下写法&#xff1a; class User(var name,var age){//使用 :this() 调用主构造方法对参数赋默认…

Linux下创建硬链接,文件访问为空,提示:xxxx: 符号连接的层数过多

Linux下创建软链接&#xff5c;硬链接&#xff0c;文件访问为空&#xff0c;提示&#xff1a;x x x: 符号连接的层数过多。 原因&#xff1a;创建符号链接的时候未使用绝对路径&#xff0c;无论是源文件路径还是目标路径&#xff0c;都需要使用绝对路径。 如&#xff1a; ln …

kotlin Bean加载失败lateinit property has not been initialized

Application run failed org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘xxxApplicationConfig’: Unsatisfied dependency expressed through field ‘appConfigService’; nested exception is org.springframework.be…

Gradle错误提示:Java home supplied via ‘xxx.xxx.xxx‘ is invalid

Gradle错误提示&#xff1a;Java home supplied via ‘org.gradle.java.home’ is invalid 描述&#xff1a;在使用idea采用gradle进行依赖的管理功能&#xff0c;当想切换java版本时&#xff08;卸载现在的java版本&#xff0c;如jdk15&#xff0c;安装另外的java版本&#xf…

恭喜你发现了宝藏,编程习惯-日积月累

总结&#xff1a; 条件查询可在数据库层创建queryDto进行统一操作。 代码复用&#xff1a;若有代码重复出现了三次&#xff0c;很大概率可以重构。&#xff08;三则重构&#xff09; dto和entity中的赋值操作&#xff0c;可以写成方法放在dto中。&#xff08;充血模型&#x…

Gradle 将项目publish到Nexus,Kotlin将项目发布到nexus,springboot项目发布到maven仓库

示例见&#xff1a;Gitte 公仓设置 在项目中添加maven-publish的插件 plugins {kotlin("jvm") version "1.3.72"kotlin("plugin.spring") version "1.3.72"java-librarymaven-publishmaven }如同maven项目一样设置组、版本信息 gr…

妙用postman系列——postman建组、分享

妙用postman系列——postman建组、分享 添加新的组和请求。 3、生成分享链接 4、导入分享链接

Postman使用Date数据类型,Postman发送Date类型数据,Postman模拟前端调用

Postman使用Date数据类型&#xff1a; 在form-data数据类型下&#xff0c;使用 2021/7/7 11:11:00 &#xff08;yyyy/MM/dd HH:mm:ss&#xff09; 的数据格式即可 如下&#xff1a; 在json数据格式中&#xff0c;这种的则不能适用&#xff0c;需要在Per-request Script中设置…

IDEA中将代码块封装为方法,IDEA代码重构快捷键

IDEA中将代码块封装为方法 选中要转换的代码块&#xff0c;快捷键&#xff1a; Windows快捷键&#xff1a;Alt Shift M Mac快捷键&#xff1a;Alt Command M 如图&#xff1a;

Kotlin协程使用,协程使用注意事项,协程中的await方法使用|不使用suspend使用协程

参见 码云 协程使用方法一 &#xff08;Dispatchers调度器模式&#xff09; 指定不同线程。同线程会挂起并阻塞&#xff08;挂起是不影响主线程执行&#xff0c;阻塞是同样的IO线程会阻塞&#xff09; withContext(Dispatchers.IO) { // &#x1f448; 切换到 IO 线程&…

Alibaba Cloud Linux 2.1903 LTS 64位服务器yum源下载404,Alibaba Cloud Linux 2实例中使用docker-ce、epel等YUM源安装软件失败

[Alibaba Cloud Linux 2.1903 LTS 64位]服务器yum源下载404 failure: repodata/repomd.xml from docker-ce-stable: [Errno 256] No more mirrors to try. https://download.docker.com/linux/centos/2.1903/x86_64/stable/repodata/repomd.xml: [Errno 14] HTTPS Error 404 -…

OpenAPI使用(swagger3),Kotlin使用swagger3,Java使用swagger3,gradle、Maven使用swagger3

OpenAPI使用&#xff08;swagger3&#xff09; demo见Gitte 一、背景及名词解释 OpenAPI是规范的正式名称。规范的开发工作于2015年启动&#xff0c;当时SmartBear&#xff08;负责Swagger工具开发的公司&#xff09;将Swagger 2.0规范捐赠给了Open API Initiative&#xff0…

linux环境下nacos的安装+启动,阿里云服务器安装nacos

nacos安装启动&#xff08;linux环境&#xff09;&#xff1a; 基础&#xff1a;安装java环境 官网下载压缩包&#xff1a;如 nacos-server-1.2.1.tar.gz 放在自定义目录下 # 解压 tar -xvf nacos-server-1.2.1.tar.gz进入bin目录 cd nacos/bin # 启动 sh startup.sh -m sta…

SpringBoot项目使用nacos,kotlin使用nacos,java项目使用nacos,gradle项目使用nacos,maven项目使用nacos

SpringBoot项目使用nacos kotlin demo见Gitte 一、引入依赖 提示&#xff1a;这里推荐使用2.2.3版本&#xff0c;springboot与nacos的依赖需要版本相同&#xff0c;否则会报错。 maven版本 <dependency><groupId>com.alibaba.cloud</groupId><artifact…

使用第三方SDK(如微信、qq、快看、头条等),调用接口405 Method Not Allowed

使用第三方SDK&#xff08;如微信、qq、快看、头条等&#xff09;&#xff0c;调用接口405 Method Not Allowed 错误描述&#xff1a;postman请求正常&#xff0c;但客户端调用后接口没有反应&#xff0c;但返回了405错误。 解决方法&#xff1a;第三方sdk调用接口需要使用http…

ECS(Linux)连接RDS,使用命令行方式连接实例

使用命令行方式连接实例 通过命令行连接RDS MySQL数据库&#xff0c;连接方式如下&#xff1a; mysql -h<连接地址> -P<端口> -u<用户名> -p -D<数据库名称># 假设 用户testuser 密码123 数据库连接为 rm-bp1457xxxxxx.mysql.rds.aliyuncs.com mysql…

kotlin设置CORS跨域资源共享,java设置允许跨域,服务端如何设置 springboot中设置跨域资源共享

CORS通信过程&#xff0c;都是浏览器或http插件自动完成&#xff0c;不需要 用户/开发人员 参与。对于开发者来说&#xff0c;CORS通信与同源的AJAX通信没有差别&#xff0c;代码是完全一样的。浏览器一旦发现AJAX请求跨源&#xff0c;就会自动添加一些附加的头信息&#xff0c…