HashMap基本使用

news2024/12/22 17:33:44

特点:

①HashMap是Map里面的一个实现类。
②没有额外需要学习的特有方法,直接使用Map里面的方法就可以了。
特点都是由键决定的:无序、不重复、无索引
④HashMap跟HashSet底层原理是一模一样的,从名字可以看出来,都是哈希表结构


底层原理:

jdk8 及以后的 HashMap 的底层原理。

  1. 创建 HashMap 集合后,会在底层创建一个长度为 16 的数组 table,并加载 负载因子为0.75 的 HashMap
    1. 这意味着当 HashMap 中的元素数量达到数组长度的 75% 时,数组会进行扩容(原有长度*2)操作,以保持较低的碰撞率和良好的性能。
    2. 为什么加载因子是0.75?【面试题】:这个值是根据空间和时间,通过泊松分布算法得到的一个折中的值。
  2. **根据元素的键计算哈希值(和值无关)**跟数组的长度计算出应存入的位置

int index=( 数组长度-1 ) & 哈希值
所以说第一个元素存入的位置不一定是 0 索引处,如下
image.png
获取元素时就从左到右遍历,所以说 HashMap 是无序的

  1. 判断当前位置是否为 null,如果是 null 直接存入
    1. 如果不是 null,表示有元素,这时则调用 equals 方法比较 键

注意这里和 HashSet 不太一样

  1. **如果键值是一样的,那么就会覆盖原有的Entry对象,不一样则存入,形成链表**
     1. 注意: jdk8 以前:新元素存入数组,老元素挂在新元素下面,jdk8及以后:新元素直接挂在老元素下面。如图:
     2. ![image.png](https://cdn.nlark.com/yuque/0/2024/png/40571611/1706352453975-788390f9-db34-4e6e-a341-6ca13d7e95da.png#averageHue=%23f5f4f4&clientId=u5ed0c2fb-24ca-4&from=paste&height=251&id=u205b9bc9&originHeight=377&originWidth=284&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=25649&status=done&style=shadow&taskId=u5d0fab22-0e25-4769-a0a2-69fd04fdb17&title=&width=189.33333333333334)
  2. 注意:当链表长度大于 8  **并且**  数组长度 >= 64 时,链表会变成红黑树。如图:
  3. ![image.png](https://cdn.nlark.com/yuque/0/2024/png/40571611/1706352648228-7a43a3dd-f57d-4ce8-bd1d-40be46bc18b4.png#averageHue=%23f5efed&clientId=u5ed0c2fb-24ca-4&from=paste&height=378&id=ua663b5fc&originHeight=567&originWidth=1244&originalType=binary&ratio=1.5&rotation=0&showTitle=false&size=152634&status=done&style=shadow&taskId=udc3c2a2c-409d-486a-882d-70c76bed134&title=&width=829.3333333333334)

  • 重写 hashCode 是为了通过键计算哈希值,而不是地址值
  • 重写 equals 是为了比较对象内部属性,

总结:

1.Hash Map底层是哈希表结构的
2.依赖hash Code方法和equals方法保证键的唯一
3.如果键存储的是自定义对象,需要重写hash code和equals方法
如果值存储自定义对象,不需要重写 hash code和equals方法


HashMap 练习 1:存储自定义对象

Snipaste_2024-01-29_10-24-27.png

Student

package com.lt.arr.map.hashmap;

import java.util.Objects;

public class Student {
    private String name;
    private int age;



   // 构造+set+get+toString
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

测试类

public class Test01 {
    public static void main(String[] args) {
//创建HashMap集合对象
HashMap<Student, String> m = new HashMap<>();
//添加键值对
m.put(new Student("zhangsan", 23), "jiangxi");
m.put(new Student("lisi", 24), "beijing");
m.put(new Student("zhangsan", 23), "shanghai");//键重复,覆盖

//遍历
//keySet
Set<Student> stu = m.keySet();
for (Student student : stu) {
    System.out.println(student + " -" + m.get(student));
}

//EntrySet
Set<Map.Entry<Student, String>> set = m.entrySet();
for (Map.Entry<Student, String> Entry : set) {
    System.out.println(Entry.getKey()+"- " + Entry.getValue());
}

//Lambda表达式
m.forEach((Student ,String) -> System.out.println(Student+"- "+String));
    }
}

Student{name = lisi, age = 24} -beijing
Student{name = zhangsan, age = 23} -shanghai

image.png
若未重写 hashCode 和 equals 方法计算哈希值时


HashMap 练习 2:利用 Map 集合进行统计:

Snipaste_2024-01-29_10-25-19.png

package com.lt.arr.map.hashmap;

import java.util.*;

public class Test02 {
    public static void main(String[] args) {
    //80名同学用for循环模拟、投票可以用随机数实现、
    Random r=new Random();
    //景点用数组存储;
    String[]Attractions={"A","B","C","D"};
    //投票结果用集合存储
    ArrayList<String>list=new ArrayList<>();
    //循环80次  模拟投票场景
    for (int i = 0; i < 80; i++) {
        int index = r.nextInt(Attractions.length);//0-3
        list.add(Attractions[index]);
    }


    //如果要统计的东西比较多,不方便使用计数器思想
    //用HashMap存储对应关系,键是景区,值是票数,谁多谁少显而易见
    HashMap<String,Integer>map=new HashMap<>();
    //遍历list集合
    for (String attractions : list) {
        if (map.containsKey(attractions)){
//若map内存在当前景点,说明已经有人投票了,只需拿出次数+1,再放入即可
            Integer count = map.get(attractions);
            count++;
            map.put(attractions,count);
        }else {
            //map内无该景点时
            map.put(attractions,1);
        }
    }

    //entrySet遍历集合
    Set <Map.Entry<String ,Integer>> set=  map.entrySet();

    for (Map.Entry<String, Integer> entry : set) {
        System.out.println(entry.getKey()+" "+entry.getValue());
    }

    //获取最大的值;
    int max=0;
    for (Map.Entry<String, Integer> entry : set) {
        if (entry.getValue()>max){
            max= entry.getValue();
        }
    }
    System.out.println(max);

    //将最大值的键打印出来
    for (Map.Entry<String, Integer> entry : set) {
        if (entry.getValue()==max){
            System.out.println(entry.getKey()+"景点想去的人最多"+"有"+max+"人");
        }
    }

    }
}

A 20
B 26
C 18
D 16
26
B景点想去的人最多有26人

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

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

相关文章

MySQL原理(一)架构组成(2)逻辑模块组成

总的来说&#xff0c;MySQL可以看成是二层架构&#xff0c;第一层我们通常叫做SQL Layer&#xff0c;在MySQL数据库系统处理底层数据之前的所有工作都是在这一层完成的&#xff0c;包括权限判断&#xff0c;sql解析&#xff0c;执行计划优化&#xff0c;query cache的处理等等&…

麒麟系统—— openKylin 安装 Nacos

麒麟系统—— openKylin 安装 Nacos 一、准备工作1. 确保麒麟系统 openKylin 已经安装完毕。2. 确保 java 已经安装完毕3. 确保 Maven 已经安装完毕 二、下载 nacos三、解压与运行解压 关于 nacos 配置 本文将分享如何在麒麟系统 openKylin 上安装 Nacos。 一、准备工作 1. …

深度学习之卷积神经网络

卷积神经网络简称为CNN 首先我们来回顾一下&#xff0c;我们之前学到的全连接的神经网络&#xff1a; 上面我们通过线性层串行连接起来的神经网络&#xff0c;我们叫做全链接的网络&#xff0c;在线性层里面&#xff0c;我们的输入值和任意的输出值之间都存在权重&#xff0c;…

《HTML 简易速速上手小册》第10章:HTML 的维护与优化(2024 最新版)

文章目录 10.1 网页性能优化10.1.1 基础知识10.1.2 案例 1&#xff1a;优化网页图像10.1.3 案例 2&#xff1a;使用延迟加载优化性能10.1.4 案例 3&#xff1a;优化 CSS 和 JavaScript 的加载 10.2 SEO 最佳实践10.2.1 基础知识10.2.2 案例 1&#xff1a;创建一个 SEO 友好的博…

伊恩·斯图尔特《改变世界的17个方程》毕达哥拉斯定理笔记

它告诉我们什么&#xff1f; 直角三角形的三个边之间有什么关系。 为什么重要&#xff1f; 它提供了几何和代数之间的重要联系&#xff0c;使我们能够根据坐标计算距离。它也催生出了三角学。 它带来了什么&#xff1f; 测绘、导航&#xff0c;以及较近代出现的狭义和广义相对论…

深入了解Matplotlib中的子图创建方法

深入了解Matplotlib中的子图创建方法 一 add_axes( **kwargs):1.1 函数介绍1.2 示例一 创建第一张子图1.2 示例二 polar参数的运用1.3 示例三 创建多张子图 二 add_subplot(*args, **kwargs):2.1 函数介绍2.2 示例一 三 两种方法的区别3.1 参数形式3.2 布局灵活性3.3 适用场景3…

基于YOLOv8的摄像头吸烟行为检测系统(Python源码+Pyqt6界面+数据集)

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文主要内容:详细介绍了摄像头下吸烟行为检测系统&#xff0c;在介绍算法原理的同时&#xff0c;给出Pytorch的源码、训练数据集以及PyQt6的UI界面。在界面中可以选择各种图片、视频进行检测识别&#xff0c;可进行置信度、Iou阈值设定…

【linux】磁盘空间不足-常用排查和处理命令

【linux】磁盘空间不足-常用排查和处理命令 1.通查一下 df -h #查看服务器磁盘空间情况 du -hs * 2>/dev/null #列出各目录所占空间大小 或 du -h -d 1 2>/dev/null #列出各目录所占空间大小 1.1情况一 df 磁盘空间和du 目录空间占用相等&#xff0c…

离线安装nginx_银河麒麟系统_nginx报错_503_500 Internal Server Error----nginx工作笔记007

如果报这个错误,意思就是,对于nginx.conf文件中指定的,文件夹没有权限 那么这个是去给对应的文件夹赋权限: chmod 777 /opt/module/test_web 就可以了,然后再去访问就不会报错了,还有 503的错误都可以这样解决 然后关于离线安装nginx,尝试了一下如果把之前安装过的nginx,直接…

app逆向-frida定位签名校验

文章目录 一、前言二、如何实现签名校验三、案例&#xff1a;定位签名校验 一、前言 当我们说应用签名校验时&#xff0c;实际上是一种安全机制&#xff0c;用于确保移动应用在被安装和运行时没有被篡改或修改。这个机制通过在应用程序文件上附加一种数字签名的方式来实现。 …

2023年算法GWCA -CNN-BiLSTM-ATTENTION回归预测(matlab)

2023年算法GWCA -CNN-BiLSTM-ATTENTION回归预测&#xff08;matlab&#xff09; GWCA -CNN-BiLSTM-Attention长城建造算法优化卷积-长短期记忆神经网络结合注意力机制的数据回归预测 Matlab语言。 长城建造算法&#xff08;Great Wall Construction Algorithm&#xff0c;GWC…

Centos Cron设置定时任务

这本是很简单的问题&#xff0c;但是我服务器重装系统两次&#xff0c;遇到的问题都不一样&#xff0c;所以记录一下 1.首先要确保服务器上有 cron 服务 sudo systemctl status crond2.设置时区 sudo timedatectl set-timezone Asia/Shanghai3.重启crond 服务使crond服务的时…

指针的深入理解(一)

这一节主要复习数组指针&#xff0c;int (* )[ ] 就是数组指针类型的标志。 因为有&#xff08;&#xff09;将*括起来&#xff0c;所以&#xff08;*&#xff09;表示一个指针。[ ] 表示数组&#xff0c;所以&#xff08;*&#xff09;[ ]就表示一个指向数组的指针&#xff…

【C++】I/O多路转接详解(一)

目录 1. 背景引入1.1 IO的过程1.2 五种IO模型1.2.1 阻塞IO1.2.2 非阻塞IO1.2.3 信号驱动IO1.2.4 IO多路转接1.2.5 异步IO 1.3 同步通信 与 异步通信1.4 阻塞 与 非阻塞1.4.1 阻塞与非阻塞区别1.4.2 设置非阻塞IO 2. select2.1 接口使用2.2 select执行过程2.3 select代码实践 3.…

C++ 数论相关题目:卡特兰数应用、快速幂求组合数。满足条件的01序列

给定 n 个 0 和 n 个 1 &#xff0c;它们将按照某种顺序排成长度为 2n 的序列&#xff0c;求它们能排列成的所有序列中&#xff0c;能够满足任意前缀序列中 0 的个数都不少于 1 的个数的序列有多少个。 输出的答案对 1097 取模。 输入格式 共一行&#xff0c;包含整数 n 。 …

开源大规模分布式MQTT消息服务器EMQX部署教程

1.EMQX是什么&#xff1f; EMQX 是一款开源的大规模分布式 MQTT 消息服务器&#xff0c;功能丰富&#xff0c;专为物联网和实时通信应用而设计。EMQX 5.0 单集群支持 MQTT 并发连接数高达 1 亿条&#xff0c;单服务器的传输与处理吞吐量可达每秒百万级 MQTT 消息&#xff0c;并…

数据结构----链表介绍、模拟实现链表、链表的使用

文章目录 1. ArrayList存在的问题2. 链表定义2.1 链表的概念及结构2.2 链表的组合类型 3. 链表的实现3.1 单向、不带头、非循环链表的实现3.2 双向、不带头节点、非循环链表的实现 4.LinkedList的使用4.1 什么是LinkedList4.2 LinkedList的使用4.2.1. LinkedList的构造4.2.2. L…

R语言(数据导入,清洗,可视化,特征工程,建模)

记录一下痛失的超级轻松的数据分析实习&#xff08;线上&#xff09;&#xff0c;hr问我有没有相关经历&#xff0c;我说我会用jupyter book进行数据导入&#xff0c;清洗&#xff0c;可视化&#xff0c;特征工程&#xff0c;建模&#xff0c;python学和用的比较多&#xff0c;…

burp靶场--xss上篇【1-15】

burp靶场–xss https://portswigger.net/web-security/cross-site-scripting 1. 什么是xss: 跨站脚本 (XSS) 是一种通常出现在 Web 应用程序中的计算机安全漏洞。XSS 允许攻击者将恶意代码注入网站&#xff0c;然后在访问该网站的任何人的浏览器中执行该代码。这可能允许攻击…

【重磅发布】已开放!模型师入驻、转格式再升级、3D展示框架全新玩法…

1月23日&#xff0c;老子云正式发布全新版本。此次新版本包含多板块功能上线和升级&#xff0c;为用户带来了含模型师入驻、三维格式在线转换升级、模型免费增值权益开放、全新3D展示框架等一系列精彩内容&#xff01; 1月23日&#xff0c;老子云正式发布全新版本。此次新版本…