【集合系列】HashMap 集合

HashMap 集合

    • 1. 概述
    • 2. 方法
    • 3. 遍历方式
    • 4. 代码示例1
    • 5. 代码示例2
    • 6. 注意事项

其他集合类

父类 Map

实现类 LinkedHashMap

集合类的遍历方式

具体信息请查看 API 帮助文档

1. 概述

HashMap 是 Java 中的一种集合类,它实现了 Map 接口。HashMap 使用键值对存储数据,每个键值对被称为一个 Entry(条目)。HashMap 使用哈希表来存储数据,因此能够在 O(1) 时间复杂度下进行插入、删除和查找操作。

HashMap 的特点包括:

  1. 键不重复:HashMap 中的键是唯一的,如果插入时有重复键,则后面的值会覆盖之前的值。

  2. 无序性:HashMap 中的元素没有固定的顺序,即不保证元素的顺序与插入的顺序一致。

  3. 允许空键和空值:HashMap 允许键和值都为 null。

  4. 非线程安全:HashMap 不是线程安全的,如果有多个线程同时访问一个 HashMap 对象并对其进行修改,可能会导致数据不一致或抛出异常。如果需要在多线程环境中使用,可以考虑使用 ConcurrentHashMap。

2. 方法

HashMap集合是Map集合的子类,因此Map集合的方法HashMap集合都能使用。

Map集合

方法名说明
V put(K key,V value)添加元素
V remove(Object key)根据键删除键值对元素
void clear()移除所有的键值对元素
boolean containsKey(Object key)判断集合是否包含指定的键
boolean containsValue(Object value)判断集合是否包含指定的值
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中键值对的个数

3. 遍历方式

与共有的 集合遍历方式 一样

4. 代码示例1

  • 代码示例
    存储学生对象并遍历
    需求:创建一个HashMap集合,键是学生对象(Student),值是籍贯(String)。存储三个键值对元素,并遍历集合
    要求:同姓名,同年龄认为是同一个学生
package text.text02;import java.util.*;
import java.util.function.BiConsumer;/*
存储学生对象并遍历
需求:创建一个HashMap集合,键是学生对象(Student),值是籍贯(String)。存储三个键值对元素,并遍历集合
要求:同姓名,同年龄认为是同一个学生*/
public class text49 {public static void main(String[] args) {//创建学生对象Student7 student1 = new Student7("张三", 23);Student7 student2 = new Student7("李四", 24);Student7 student3 = new Student7("王五", 25);Student7 student4 = new Student7("王五", 25);//创建集合对象HashMap<Student7, String> hm = new HashMap<>();  //键是自定义对象,必须要重写equals和hashCode方法//添加集合元素hm.put(student1, "山西");hm.put(student2, "河南");hm.put(student3, "湖北");hm.put(student4, "湖北");//遍历集合            、//1.通过键找值的方式遍历System.out.println("1.通过键找值的方式遍历:");Set<Student7> set = hm.keySet();Iterator<Student7> it = set.iterator();while (it.hasNext()) {Student7 key = it.next();String value = hm.get(key);System.out.println(key + " = " + value);}//2.通过键值对的方式遍历System.out.println("2.通过键值对的方式遍历:");Set<Map.Entry<Student7, String>> entries = hm.entrySet();for (Map.Entry<Student7, String> map : entries) {Student7 key = map.getKey();String value = map.getValue();System.out.println(key + " = " + value);}//3.通过结合Lambda表达式的方式遍历System.out.println("3.通过结合Lambda表达式的方式遍历:");hm.forEach(new BiConsumer<Student7, String>() {@Overridepublic void accept(Student7 key, String value) {System.out.println(key + " = " + value);}});}
}class Student7 {private String name;private int age;public Student7() {}public Student7(String name, int age) {this.name = name;this.age = age;}/*** 获取** @return name*/public String getName() {return name;}/*** 设置** @param name*/public void setName(String name) {this.name = name;}/*** 获取** @return age*/public int getAge() {return age;}/*** 设置** @param age*/public void setAge(int age) {this.age = age;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Student7 student7 = (Student7) o;return age == student7.age && Objects.equals(name, student7.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}public String toString() {return "Student7{name = " + name + ", age = " + age + "}";}
}
  • 输出结果
    • 1.通过键找值的方式遍历
      在这里插入图片描述

    • 2.通过键值对的方式遍历
      在这里插入图片描述

    • 3.通过结合Lambda表达式的方式遍历
      在这里插入图片描述

5. 代码示例2

  • 代码示例
    Map集合案例–统计投票人数
    需求:某个班级80名学生,现在需要组成秋游活动,班长提供了四个景点,依次是(A,B,C,D),每个学生只能选择一个景点,请统计出最终哪个景点想去的人数最多。
package text.text02;import java.util.*;/*
Map集合案例--统计投票人数
需求:某个班级80名学生,现在需要组成秋游活动,班长提供了四个景点,依次是(A,B,C,D),每个学生只能选择一个景点,请统计出最终哪个景点想去的人数最多。*/
public class text50 {public static void main(String[] args) {//计数器方法System.out.println("====================计数器方法==================");method1();//通用方法System.out.println("====================通用方法====================");method2();}//计数器方法public static void method1() {//定义变量记录A,B,C,D四个景点的投票人数int A = 0;int B = 0;int C = 0;int D = 0;//创建集合HashMap<String, Integer> hm = new HashMap<>();//利用随机数模拟随机选择的景点,并利用循环添加进集合Random r = new Random();for (int i = 0; i < 80; i++) {int num = r.nextInt(4);if (num == 0) A++;if (num == 1) B++;if (num == 2) C++;if (num == 3) D++;}//将景点以及每个景点的投票人数添加进去hm.put("A", A);hm.put("B", B);hm.put("C", C);hm.put("D", D);System.out.println("四个景点的投票情况:" + hm);//判断哪个景点投票人数最多//求出投票最多的票数int sum = 0;//定义一个变量记录最多的景点的票数Set<String> set = hm.keySet();for (String key : set) {Integer value = hm.get(key);if (value > sum) {sum = value;}}System.out.println("景点投票最多的票数:" + sum);//遍历map集合,根据投票最多的票数确定景点(可能存在多个景点投票一样的情况)for (String key : set) {Integer value = hm.get(key);if (value == sum) {System.out.println("投票最多的景点:" + key);}}}//通用方法public static void method2() {//定义个数组,存储四个景点String[] arr = {"A", "B", "C", "D"};//定义个集合用来存储每个学生投票的景点ArrayList<String> list = new ArrayList<>();Random r = new Random();//利用循环将学生的投票景点添加进集合for (int i = 0; i < 80; i++) {int index = r.nextInt(arr.length);list.add(arr[index]);}System.out.println("ArrayList集合里的数据:" + list);//创建双列集合用于存储景点名称和票数HashMap<String, Integer> hm = new HashMap<>();//遍历单列集合,并将其中的景点和对应的票数添加进双列集合for (String name : list) {//单列集合中存储的景点名称在双列集合中存在if (hm.containsKey(name)) {//获取该景点的投票数Integer value = hm.get(name);//将投票数+1value++;//再将新的投票数覆盖原来的投票数hm.put(name, value);}//单列集合中存储的景点名称在双列集合中不存在else {hm.put(name, 1);}}System.out.println("HashMap集合里面的数据:" + hm);//判断哪个景点投票人数最多//求出投票最多的票数int sum = 0;//定义一个变量记录最多的景点的票数Set<String> set = hm.keySet();for (String key : set) {Integer value = hm.get(key);if (value > sum) {sum = value;}}System.out.println("景点投票最多的票数:" + sum);//遍历map集合,根据投票最多的票数确定景点(可能存在多个景点投票一样的情况)for (String key : set) {Integer value = hm.get(key);if (value == sum) {System.out.println("投票最多的景点:" + key);}}}
}
  • 输出结果
    • 计数器方法
      在这里插入图片描述

    • 通用方法
      在这里插入图片描述

6. 注意事项

  1. 键的唯一性:HashMap 中的键是唯一的,如果插入时有重复键,则后面的值会覆盖之前的值。因此,在使用 HashMap 时要确保键的唯一性,避免出现重复键的情况。

  2. 键的稳定性:HashMap 的元素没有固定的顺序,也就是说,存入元素的顺序与取出元素时的顺序可能不一致。如果需要按照特定的顺序遍历或操作元素,可以考虑使用 LinkedHashMap。它是 HashMap 的一个子类,保留了元素插入的顺序。

  3. hashCode()和equals()方法:HashMap 使用键的 hashCode() 和 equals() 方法来确定键的位置。因此,键的类型必须正确实现这两个方法,以确保正确的插入、查找和删除操作。如果自定义的类作为 HashMap 的键,必须重写 hashCode() 和 equals() 方法,以保证键的唯一性和正确性。

  4. 并发安全性:HashMap 是非线程安全的,如果有多个线程同时访问一个 HashMap 并对其进行修改,可能会导致数据不一致或抛出异常。如果需要在多线程环境中使用 HashMap,可以考虑使用 ConcurrentHashMap,它是线程安全的。

  5. 初始容量和负载因子:HashMap 默认的初始容量为 16,并且每次扩容是当前容量的两倍。若事先无法估计容量大小,则可以通过构造函数指定初始容量和负载因子。负载因子表示 HashMap 在容量自动增加之前可以达到的平均负载程度,默认为 0.75。较低的负载因子会减少碰撞,但会增加空间消耗;较高的负载因子会增加碰撞,但会减少空间消耗。根据实际情况选择合适的初始容量和负载因子来平衡空间和时间的开销。

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

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

相关文章

手动汉化unity编辑器,解决下载中文语言报错问题

手动汉化unity编辑器&#xff0c;解决下载中文语言报错问题 START 最近在下载支持微信小程序版本的编辑器时&#xff0c;中文语言包&#xff0c;一直无法下载。记录一下 手动汉化unity编辑器的方法 &#xff0c;帮助和我遇到同样问题的人。 解决方案 1. 下载汉化包 https:…

ubuntu22.04@laptop OpenCV Get Started: 005_rotate_and_translate_image

ubuntu22.04laptop OpenCV Get Started: 005_rotate_and_translate_image 1. 源由2. translate/rotate应用Demo3 translate_image3.1 C应用Demo3.2 Python应用Demo3.3 平移图像过程 4. rotate_image4.1 C应用Demo4.2 Python应用Demo4.3 旋转图像过程 5. 总结6. 参考资料 1. 源由…

unity-ios-解决内购商品在Appstore上面已配置,但在手机测试时却无法显示的问题

自己这几天用 unity 2021 xcode 14.2 开发ios内购&#xff0c;appstore上面内购商品都已经配置好了&#xff0c;但是在手机里就是不显示&#xff0c;最后才发现必需得满足以下条件才行&#xff1a; 1. Appstore后台 -> 内购商品 -> 商品状态必需为『准备提交』以上状态…

基于 Python 的漏洞扫描系统,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

Web 目录爆破神器:DirBuster 保姆级教程(附链接)

一、介绍 DirBuster 是一个用于强制目录浏览的渗透测试工具&#xff0c;它主要用于在Web应用程序中识别隐藏的目录和文件。这个工具被设计成非常灵活&#xff0c;可以根据用户的需求进行配置。以下是 DirBuster 的一些主要特点和用法&#xff1a; 主要特点&#xff1a; 字典爆…

k8s报错记录(持续更新中....)

k8s报错记录(持续更新中…) 1. 部署k8s遇到kube-flannel已经构建&#xff0c;但是coredns一直处于ContainerCreating和pending状态 解决问题&#xff1a; 通过 kubectl describe pod -n kube-system coredns-7ff77c879f-9ls2b 查看pod的详细信息&#xff0c;报错说是cni 配置没…

主动网络安全:成本效率和危机管理的战略方法

如何面对复杂网络攻击的进攻策略以及零信任模型的作用。攻击后反应性网络安全策略的基本步骤&#xff0c;透明度和准备工作。 讨论采用主动网络安全方法的好处&#xff0c;特别是在成本效率和危机管理方面&#xff0c;进攻性安全测试对合规性和零日响应的影响。 组织应该更多…

K8S之Pod常见的状态和重启策略

Pod常见的状态和重启策略 常见的Pod状态PendingPodScheduledUnschedulablePodInitializingImagePullBackOffInitializedRunningErrorCrashLoopBackOffTerminatingSucceededFailedEvictedUnknown Pod的重启策略使用Always重启策略使用Never重启策略使用OnFailure重启策略(常用) …

HttpClient | 支持 HTTP 协议的客户端编程工具包

目录 1、简介 2、应用场景 3、导入 4、API 5、示例 5.1、GET请求 5.2、POST请求 &#x1f343;作者介绍&#xff1a;双非本科大三网络工程专业在读&#xff0c;阿里云专家博主&#xff0c;专注于Java领域学习&#xff0c;擅长web应用开发、数据结构和算法&#xff0c;初…

java实现栈功能

1.使用数组方式 public static void main(String[] args) throws Exception {BufferedReader br new BufferedReader(new InputStreamReader(System.in));int operateNum Integer.parseInt(br.readLine());//操作次数String inputInfo;//输入信息StringBuilder outputSb new…

Mac电脑如何通过终端隐藏应用程序?

在我们使用Mac电脑的时候难免会遇到想要不想看到某个应用程序又不想卸载它们。值得庆幸的是&#xff0c;macOS具有一些强大的文件管理功能&#xff0c;允许用户轻松隐藏&#xff08;以及稍后显示&#xff09;文件甚至应用程序。 那么&#xff0c;Mac电脑如何通过终端隐藏应用程…

阿里云游戏服务器多少钱一个月?

阿里云游戏服务器租用价格表&#xff1a;4核16G服务器26元1个月、146元半年&#xff0c;游戏专业服务器8核32G配置90元一个月、271元3个月&#xff0c;阿里云服务器网aliyunfuwuqi.com分享阿里云游戏专用服务器详细配置和精准报价&#xff1a; 阿里云游戏服务器租用价格表 阿…

Android AOSP源码研究之万事开头难----经验教训记录

文章目录 1.概述2.Android源下载1.配置环境变量2.安装curl3.下载repo并授权4.创建一个文件夹保存源码5.设置repo的地址并配置为清华源6.初始化仓库7.指定我们需要下载的源码分支并初始化 2.1 使用移动硬盘存放Android源码的坑2.2 解决方法 3.Android源码编译4.Android源烧录 1.…

Python:批量url链接保存为PDF

我的数据是先把url链接获取到存入excel中&#xff0c;后续对excel做的处理&#xff0c;各位也可以直接在程序中做处理&#xff0c;下面就是针对excel中的链接做批量处理 excel内容格式如下&#xff08;涉及具体数据做了隐藏&#xff09; 标题文件链接文件日期网页标题1http://…

学习笔记——ENM模拟

学习笔记——ENM模拟 文章目录 前言一、文献一1. 材料与方法1.1. 大致概念1.2. 生态模型的构建1.2.1. 数据来源&#xff1a;1.2.2. 数据处理&#xff1a;1.2.3. 模型参数优化&#xff1a; 1.3. 适生情况预测1.3.1. 预测模型构建1.3.2. 适生区划分 1.4. 模型的评估与验证 2. 结果…

【Web】Spring rce CVE-2022-22965漏洞复现学习笔记

目录 原理概览 漏洞简述 Tomcat AccessLogValve 和 access_log 例题: 原理概览 spring框架在传参的时候会与对应实体类自动参数绑定&#xff0c;通过“.”还可以访问对应实体类的引用类型变量。使用getClass方法&#xff0c;通过反射机制最终获取tomcat的日志配置成员属性…

内网渗透靶场02----Weblogic反序列化+域渗透

网络拓扑&#xff1a; 攻击机&#xff1a; Kali: 192.168.111.129 Win10: 192.168.111.128 靶场基本配置&#xff1a;web服务器双网卡机器&#xff1a; 192.168.111.80&#xff08;模拟外网&#xff09;10.10.10.80&#xff08;模拟内网&#xff09;域成员机器 WIN7PC192.168.…

第59讲订单数据下拉实现

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;/*** 订单查询 type值 0 全部订单 1待付款 2 待收货 3 退款/退货* param type* return*/RequestMapping("/list")public R list(Integer type,Integer page,Integer pageSize){System.out.pri…

基金是什么

一、基金是什么&#xff1f; 买基金就是委托别人帮我们投资&#xff0c;替我们买卖股票债券。 二、为什么委托别人&#xff1f; 因为我们不懂投资方面的知识&#xff0c;或者我们没有时间来做投资&#xff0c;那么就可以找专业人士帮我们投资。就像家长帮小孩报辅导班&#…

[幻灯片]分析设计高阶-02-领域建模结构部分Part1

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 如何选择UMLChina服务 UMLChina公众号精选&#xff08;20240207更新&#xff09;