双例集合(二)——双例集合的实现类之HashMap容器类

        双例集合的常用实现类有HashMap和TreeMap两个,通过这两个类我们可以实现Map接口定义的容器,一般情况下使用HashMap容器类较多。

        HashMap容器类是Map接口最常用的实现类,它的底层采用Hash算法来实现,这也就满足了键key不能重复的要求。如果发生了key重复的情况,则后添加的键会覆盖先添加的键。由于采用了Hash算法来实现的原因,HashMap容器类在查找、删除、修改方面的效率是比较高的。

        HashMap容器类是Map接口的具体实现类,在使用HashMap容器类创建容器时可以采用Map来进行具体的实例化。Map接口是泛型接口,因此在使用的时候要给定泛型类型,采用泛型类的实例化格式来进行实例化。

        HashMap容器类实现了Map接口,因此也实现了Map接口中的所有抽象方法。故而在HashMap中可以通过实现Map接口中的方法来对容器中的元素进行添加、获取、删除等操作。

        通过put方法,可以将指定的元素添加到容器中去,这里要说明的是,添加元素的种类由容器的类型来确定,即在定义容器的时候我们会给定key与value的类型,在添加元素的时候必须按照指定的类型来添加元素。比如在以下的演示代码中我们定义了一个容器,它的key与value的值都是String,这时如果我们要将某一个指定数据作为元素添加到容器map中,所添加的数据必须和给定的类型相对应。此外,还要强调一点,在定义双例容器时,给定的类型并不只是常见的数据类型,它也可以是对象,只要我们在添加元素的时候符合对应关系即可。比如我们创建一个新的容器map3,创建语法为Map<String,User> map3 = new HashMap<>();这时添加元素时value的值就是类User对应的对象,这时如果要添加元素到容器map3中,采用的代码就可以是:map3.put("a",new User("linyi",18));

        将指定的元素添加到容器中后我们还需要将容器中的元素取出来,这样才能够实现对容器中的氧元素进行操作。在HashMap容器类可以通过三种不同的方式来取出容器中对应的元素。

        首先我们介一种比较简单的方法,通过get方法来获取容器中的乐元素。get方法是一个含参方法,需要我们传入一个参数,这个参数就是容器中的key的值。当我们传入key的值后,get方法就会通过我们给定的key的值来找到与之对应的value的值,并将这个值返回。比如在下面的演示代码中我们通过对象map调用get方法,并传入参数a。因为a这个key的值在容器map中对应的value的值为A,因此调用此方法后会将A作为运行结构返回。用这种方式来获取容器中的value的值显然有一个要求,那就是要知道容器中所有的key的值,并且如果要访问容器中所有的value的值,就必须多次调用get方法才可以,因为这个方法一次只能返回一个value的值。

        鉴于get方法的弊端,当我们不知道容器中的的key的值的时候,显然get方法来获取容器中value的值是不现实的。那么有没有什么方法能获取容器中的key的值呢?答案是有的,我们在介绍Map接口中的常用方法的时候提到过一个方法keyset,这个方法能够获取容器中的key的值,并且将其储存到一个set容器中,我们只要遍历这个set容器就可以得到双例集合中key的值,再结合get方法就可以获取对应的value的值了。

        除了上面介绍的两种获取双例集合元素的方法外,还有一种方法可以获取双例集合中的元素的方法,那就是entrySet方法获取双例集合中的元素。entrySet方法返回一个Map.Entry类型的数据,这个类型的数据表示的是双例集合中key和value的对应关系。因为Entry是定义在Map接口中的一个内部泛型接口,因此这个数据类型要用Map. 的形式来进行书写,就像在演示代码中的用来接收数据的变量entry给定的泛型为Map.Entry一样。并且因为Enty也是泛型接口,因此在使用时也要给定泛型,所以entry最终指定的泛型书写为Map.Entry<String,String>。

        除了常规的获取元素的操作之外,由于HashMap容器类是Map接口的实现类,因此HashMap容器类也可以对容器中的元素进行并集和删除等操作。并集是通过方法putAll实现的,putAll方法是实现并集操作时要求两个容器中的泛型类型时一样的,比如容器1中的泛型为K--String,V--String,那么,和容器1进行并集操作的容器2的泛型类型也应该为K--String,V--String。并集操作结束后,结果返回在putAll方法前面的那个容器中,遍历这个容器就能看到并集操作后的结果。删除元素的操作通过方法remove来实现,这个方法需要传入一个参数,参数为容器中对应的的key的值,删除了key的值,与之对应的value的值也就消失了。同时要注意的是,remove方法通过key的值找到value的值并将其在容器中删除的时候还会将这个value的值返回。

        那么如果我们不知道容器中是否含有某一个key的值以及它所对应的value的值时我们是不是就不能对容器中的元素进行操作了呢?答案是肯定的,但是我们可以通过containKey和containValue方法来判断某一个key或者value的是否存在于指定的容器中。这样我们就可以将这两个方法和上面的各种操作结合起来对容器中的元素进行适当的操作。

package com.container.demo;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.HashMap;
public class HashMapTest {public static void main(String[] args) {//实例化HashMap容器Map<String,String> map = new HashMap<>();//添加元素String value1 = map.put("a","A");System.out.println(value1);String value2 = map.put("a","B");System.out.println(value2);String value3 = map.put("b","B");System.out.println(value3);System.out.println("_____________________");//获取元素String val1 = map.get("a");System.out.println(val1);String val2 = map.get("b");System.out.println(val2);System.out.println("_________________");map.put("c","C");map.put("d","D");map.put("e","E");map.put("f","F");map.put("g","G");Set<String> keys = map.keySet();System.out.println(map.remove("g"));for (String key:keys) {String va = map.get(key);System.out.println(key+"__________"+va);}System.out.println("___________________");Set<Map.Entry<String,String>> entry = map.entrySet();for (Map.Entry<String,String> entrySet:entry) {String key =  entrySet.getKey();String v = entrySet.getValue();System.out.println(key+"__________"+v);}System.out.println("___________________");Map<String,String> map1 = new HashMap<>();map1.put("h","H");map.putAll(map1);Set<String> keys1 = map.keySet();for (String key:keys1) {System.out.println("key: "+key+" value: "+map.get(key));}System.out.println("____________________");map1.put("h","HHH");map.putAll(map1);Set<String> keys2 = map.keySet();Iterator<String> iterator =keys2.iterator();while (iterator.hasNext()){String value = iterator.next();System.out.print("key: "+value+" value: "+map.get(value)+"\t");}System.out.println();for (String key:keys2) {System.out.println("key: "+key+" value: "+map.get(key));}System.out.println("_______________________");String v1 = map.remove("d");String v2 = map.remove("e");String v3 = map.remove("f");System.out.println(v1);System.out.println(v2);System.out.println(v3);System.out.println("=______   --  _____=");Set<Map.Entry<String,String>> entry1 = map.entrySet();for (Map.Entry<String,String> entrys: entry1) {System.out.println("key: "+entrys.getKey()+" value: "+entrys.getValue());}System.out.println("____________________________");System.out.println("key:e是否存在:"+map.containsKey("e"));System.out.println("Value:HHH是否存在:"+map.containsValue("HHH"));}
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/857279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

揭秘!速卖通、敦煌网、国际站出单背后的黑科技:自养号测评技术

在竞争激烈的跨境电商平台上&#xff0c;如亚马逊、速卖通、Lazada、Shopee、敦煌网、Temu、Shein、美客多和阿里国际等&#xff0c;稳定出单成为每位卖家共同追求的目标。为了实现这一目标&#xff0c;卖家需要从产品选择、运营策略和客户服务等多个维度进行全面考量&#xff…

华为重磅官宣:超9亿台、5000个头部应用已加入鸿蒙生态!人形机器人现身 专注AI芯片!英伟达挑战者Cerebras要上市了

内容提要 华为表示&#xff0c;盘古大模型5.0加持&#xff0c;小艺能力全新升级。小艺智能体与导航条融为一体&#xff0c;无处不在&#xff0c;随时召唤。只需将文字、图片、文档“投喂”小艺&#xff0c;即可便捷高效处理文字、识别图像、分析文档。 正文 据华为终端官方微…

JavaWeb阶段学习知识点(一)

【参考视频】https://www.bilibili.com/video/BV1m84y1w7Tb?p=167&vd_source=38a16daddd38b4b4d4536e9c389e197f SpringBoot项目的创建和接口配置 做一个springboot项目,从创建项目到实现浏览器访问localhost:8080/hello返回字符串hello world的全流程 1. 创建项目 idea新…

上海科技博物馆超薄OLED柔性壁纸屏应用方案

产品&#xff1a;2组55寸OLED柔性屏2x1 特点&#xff1a;嵌入墙体&#xff0c;与空间装饰融入一体 用途&#xff1a;播放文物展示 一、项目背景 上海科技博物馆作为展示科技与文化的交汇点&#xff0c;一直致力于为观众提供沉浸式的参观体验。为了提升文物展示的现代化和科技感…

芯片验证分享系列总结及PPT分享

大家好&#xff0c;我是谷公子。花了将近两个月时间&#xff0c;《芯片验证分享》这一系列视频分享已经更新完了&#xff0c;内容涵盖了名词解释、芯片验证原则、激励开发、代码审查以及芯片调试。这一系列视频主要侧重于芯片验证理论的分享&#xff0c;希望可以帮助大家构建芯…

wvp-GB28181-pro 源码分析-点播流程(三)

文章目录 一 、28181-2016标准文档中的点播流程二 、点播流程源码分析2.1 页面发起点播请求2.2 与ZLM协商SSRC信息2.3 订阅zlmediakit的hook消息及发送invite信令2.4 处理invite信令响应并应答2.5 收到ZLM的推流通知2.6 播放成功2.7 停止点播流程2024年6月20日下载的wvp-GB2818…

程序员·职场效能必修宝典㊿:正视自己的职业倦怠

> 【易编橙终身成长社群,相遇已是上上签!】- 点击跳转~ < 作者:哈哥撩编程 (视频号同名) 图书作者:程序员职场效能宝典 博客专家:全国博客之星第四名 超级个体:COC上海社区主理人 特约讲师:谷歌亚马逊分享嘉宾

VBA语言専攻T3学员领取资料通知

各位学员∶本周MF系列VBA技术资料增加631-635讲&#xff0c;T3学员看到通知后请免费领取,领取时间6月21日晚上19:00-6月22日晚上20:00。本次增加内容&#xff1a; MF631:提取某列数据的唯一值 MF632:自动调整文本并旋转到90度 MF633:仅复制格式 MF634:Mod运算判断奇数偶数 …

又发现一款独立清理神器,界面清爽,功能强大,没有广告!

360清理Pro独立提取版是360公司推出的一款清理软件&#xff0c;主要用于清理系统垃圾和优化系统性能&#xff0c;涵盖了四大类型的清理场景&#xff0c;分别为&#xff1a;微信、QQ的垃圾扫描及清理&#xff0c;系统盘中的大文件、重复文件扫描及清理以及系统软件使用痕迹的清理…

毕业答辩制作PPT【攻略】

毕业答辩制作PPT【攻略】 前言版权毕业答辩制作PPT【攻略】一、WPS AI 15天免费会员二、AI文档生成PPT三、修改完善PPT 最后 前言 2024-06-14 23:43:05 以下内容源自《【攻略】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN…

fast lio 运行mid360采集的数据,并保存每一帧的点云PCD和位姿

首先我们看到在map_incremental中存在一个保存每一帧PCD文件的代码&#xff0c;因此想利用改代码。 如何修改呢&#xff1f; 一. 改每一帧无畸变点云的PCD的保存代码 /**************** save map ****************//* 1. make sure you have enough memories/* 2. noted that…

数字化物资管理系统的未来:RFID技术的创新应用

在信息化和智能化不断发展的背景下&#xff0c;物资管理系统的数字化转型已成为各行各业关注的焦点。RFID技术作为一种先进的物联网技术&#xff0c;通过全面数字化实现物资信息的实时追踪和高效管理&#xff0c;为企业的物资管理提供了强有力的支持。 首先&#xff0c;RFID技…

linux中DNS域名解析服务(后续补充)

分离解析简介&#xff1a; 分离解析的域名服务器实际也是主域名服务器&#xff0c;这里主要是指根据不同的客户端提供不同的域名解析记录。比如来自内网和外网的不同网段地址的客户机请求解析同一域名时&#xff0c;为其提供不同的解析结果。 实验要求&#xff1a;防火墙要么关…

如何基于项目人力和管线方案选择FGUI和UGUI

1&#xff09;如何基于项目人力和管线方案选择FGUI和UGUI 2&#xff09;TMP字体出包丢失字体描边 3&#xff09;如何将一张贴图经过Shader处理后的结果输出给另外一个Shader使用 4&#xff09;为什么我的水这么干净&#xff0c;和UE教程里的有差别 这是第390篇UWA技术知识分享的…

Javase.认识异常

认识异常 【本章目标】1. 异常的概念与体系结构1.1 异常的概念1.2 异常的体系结构1.3 异常的分类 2. 异常的处理2.1 防御式编程2.2 异常的抛出2.3 异常的捕获2.3.2 try-catch捕获并处理2.3.3 finally2.4 异常的处理流程 3. 自定义异常类 【本章目标】 异常概念与体系结构异常的…

技术实践:基于百数低代码平台的学生档案管理系统搭建

在数字化时代&#xff0c;信息技术的应用已经渗透到社会的各个角落&#xff0c;教育领域也不例外。学生档案管理作为学校日常运作的重要一环&#xff0c;其信息化、智能化的需求日益凸显。特别是在拥有多个校区的大型学校中&#xff0c;如何高效、准确地管理学生档案&#xff0…

el-input-number 限制输入正整数

vue 页面 限制输入最小值为0 :min"0" <el-input-number v-model"scope.row.num" change"handleNumChange(scope)" keydown.enter.prevent style"width: 200px; " :min"0" />methods 里面限制输入的数字不为小数 使…

Junit4测试基本应用(白盒测试)

Junit4测试基本应用&#xff08;白盒测试&#xff09; 一、实验目的 掌握Junit的基本操作&#xff0c;进行较简单的单元测试。 二、Junit4测试的使用 1. 创建java项目JUnitText 我使用的Eclipse&#xff0c;在左侧Package Explorer(包资源管理器)右键&#xff0c;新建Java …

若依 ruoyi 排序 顺序 倒序 的实现

1. table标签新增排序相关属性 // :default-sort"defaultSort" 指定默认排序 // sort-change"handleSortChange" 指定排序点击事件 :default-sort"defaultSort" sort-change"handleSortChange" 2. 列上新增排序相关配置 自定义查询语…

mac苹果窗口辅助工具:Magnet for mac 2.14.0中文免激活版

Magnet 是一款针对 MacOS 系统的窗口管理工具软件。它能够帮助用户更加高效地管理和组织桌面上的窗口&#xff0c;通过简单的快捷键操作&#xff0c;可以将窗口自动调整到指定的位置和大小&#xff0c;实现多窗口快速布局。Magnet 还支持多显示器环境下的窗口管理&#xff0c;可…