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

2024-06-22 06:20

本文主要是介绍双例集合(二)——双例集合的实现类之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"));}
}

 

 

这篇关于双例集合(二)——双例集合的实现类之HashMap容器类的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1083528

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

LeetCode11. 盛最多水的容器题解

LeetCode11. 盛最多水的容器题解 题目链接: https://leetcode.cn/problems/container-with-most-water 示例 思路 暴力解法 定住一个柱子不动,然后用其他柱子与其围住面积,取最大值。 代码如下: public int maxArea1(int[] height) {int n = height.length;int

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

亮相WOT全球技术创新大会,揭秘火山引擎边缘容器技术在泛CDN场景的应用与实践

2024年6月21日-22日,51CTO“WOT全球技术创新大会2024”在北京举办。火山引擎边缘计算架构师李志明受邀参与,以“边缘容器技术在泛CDN场景的应用和实践”为主题,与多位行业资深专家,共同探讨泛CDN行业技术架构以及云原生与边缘计算的发展和展望。 火山引擎边缘计算架构师李志明表示:为更好地解决传统泛CDN类业务运行中的问题,火山引擎边缘容器团队参考行业做法,结合实践经验,打造火山

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

基于Springboot + vue 的抗疫物质管理系统的设计与实现

目录 📚 前言 📑摘要 📑系统流程 📚 系统架构设计 📚 数据库设计 📚 系统功能的具体实现    💬 系统登录注册 系统登录 登录界面   用户添加  💬 抗疫列表展示模块     区域信息管理 添加物资详情 抗疫物资列表展示 抗疫物资申请 抗疫物资审核 ✒️ 源码实现 💖 源码获取 😁 联系方式 📚 前言 📑博客主页:

探索蓝牙协议的奥秘:用ESP32实现高质量蓝牙音频传输

蓝牙(Bluetooth)是一种短距离无线通信技术,广泛应用于各种电子设备之间的数据传输。自1994年由爱立信公司首次提出以来,蓝牙技术已经经历了多个版本的更新和改进。本文将详细介绍蓝牙协议,并通过一个具体的项目——使用ESP32实现蓝牙音频传输,来展示蓝牙协议的实际应用及其优点。 蓝牙协议概述 蓝牙协议栈 蓝牙协议栈是蓝牙技术的核心,定义了蓝牙设备之间如何进行通信。蓝牙协议

python实现最简单循环神经网络(RNNs)

Recurrent Neural Networks(RNNs) 的模型: 上图中红色部分是输入向量。文本、单词、数据都是输入,在网络里都以向量的形式进行表示。 绿色部分是隐藏向量。是加工处理过程。 蓝色部分是输出向量。 python代码表示如下: rnn = RNN()y = rnn.step(x) # x为输入向量,y为输出向量 RNNs神经网络由神经元组成, python