4.5.7 HashMap

news2024/11/19 5:54:46

文章目录

  • 1.概述
  • 2.练习:字符串中字符统计
  • 3.Map与HashMap的比较
  • 4.HashMap扩容


1.概述

HashMap底层是一个Entry[ ]数组,长度为16,当存放数据时,会根据hash算法来计算数据的存放位置
算法:hash(key)%n , n就是数组的长度,其实也就是集合的容量
当计算的位置没有数据的时候,会直接存放数据
当计算的位置,有数据时,会发生hash冲突/hash碰撞,解决的办法就是采用链表的结构,在数组中指定位置处已有元素之后插入新的元素,也就是说数组中的元素都是最早加入的节点

  1. HashMap的结构是数组+链表 或者 数组+红黑树的形式
  2. HashMap底层的Entry[ ]数组,初始容量为16,加载因子是0.75f,扩容按约为2倍扩容
  3. 当存放数据时,会根据hash(key)%n算法来计算数据的存放位置,n就是数组的长度,其实也就是集合的容量
  4. 当计算到的位置之前没有存过数据的时候,会直接存放数据
  5. 当计算的位置,有数据时,会发生hash冲突/hash碰撞
    解决的办法就是采用链表的结构,在数组中指定位置处以后元素之后插入新的元素
    也就是说数组中的元素都是最早加入的节点
  6. 如果链表的长度>8时,链表会转为红黑树,当链表的长度<6时,会重新恢复成链表
    在这里插入图片描述

2.练习:字符串中字符统计

package partThree;

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

/**
 * 本类用来完成Map集合相关练习
 * 需求:提示并接收用户输入的一串字符,并且统计出每个字符出现的次数
 * */
public class TestMap2 {
    public static void main(String[] args) {
        //1.提示用户输入要统计的字符串
        System.out.println("请输入您要统计的字符串");
        //2.接收用户输入的要统计的字符串
        String input = new Scanner(System.in).nextLine();
        //3.获取到用户输入的每个字符,String底层维护的是char[]
        //创建map集合存放数据,格式:{b=2,d=4,g=3}
        /**统计的是每个字符出现的次数,所以字符是char类型,次数是int,但是不可以使用基本类型,需要使用包装类型*/
        Map<Character,Integer> map = new HashMap();

        //开始位置:0 - 数组的第一个元素
        //结束位置:<input.length() 或者 <=input,length()-1
        //如何变化:++
        for (int i = 0; i < input.length(); i++) {
            char key = input.charAt(i);//获取一串字符中指定位置上的字符
            System.out.println("获取到的第"+(i+1)+"个字符:"+key);

            //4.统计每个字符出现的个数,存起来,存到map
            Integer value = map.get(key);//要先拿着key到map中找是不是有value
            if(value == null) {//如果判断为null,说明之前没有存过这个字符
                map.put(key, 1);//把当前的字符作为key存入,次数存1
            }else {
                map.put(key,value+1);//如果存过值,给之前的次数+1
            }
        }
        System.out.println("各个字符出现的频率为:");
        System.out.println(map);
    }
}

3.Map与HashMap的比较

  1. Map是一个接口,HashMap是一个Map的实现类(HashMap继承了AbstractMap类,实现了Map接口);

  2. 它们都是以键值对的双列储存,一个键对应一个值,键不可重复,值可以重复。而且他们的存储是无序的和放入的前后顺序无关;

  3. 他们都是只能有一个键为null的数据,但是可以有多个记录的值为null如下:
    [null:adc,a:null,b:null]

  4. HashMap是项目中最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。

  5. HashMap不支持线程的同步,是非线程安全的,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要同步,可以用 Collections和synchronizedMap方法使HashMap具有同步能力,或者使用ConcurrentHashMap。

  6. 项目中大多使用的格式为:
    Map map = new HashMap<>();

4.HashMap扩容

成长因子:
static final float DEFAULT_LOAD_FACTOR = 0.75f;
前面的讲述已经发现,当你空间只有仅仅为10的时候是很容易造成2个对象的hashcode 所对应的地址是一个位置的情况。这样就造成 2个 对象会形成散列桶(链表)。这时就有一个加载因子的参数,值默认为0.75 ,如果你hashmap的 空间有 100那么当你插入了75个元素的时候 hashmap就需要扩容了,不然的话会形成很长的散列桶结构,对于查询和插入都会增加时间,因为它要一个一个的equals比较。但又不能让加载因子很小,如0.01,这样显然是不合适的,频繁扩容会大大消耗你的内存。这时就存在着一个平衡,jdk中默认是0.75,当然负载因子可以根据自己的实际情况进行调整。

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

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

相关文章

计算机网络-无线网络

文章目录前言无线局域网 WLAN无线局域网的组成移动自组网络无线传感器网络 WSN (Wireless Sensor Network)802.11 局域网的物理层802.11 局域网的 MAC 层协议WLAN无线控制器和FIT&#xff08;瘦&#xff09; AP总结前言 本博客仅做学习笔记&#xff0c;如有侵权&#xff0c;联…

Python-项目实战--飞机大战-敌机出场(6)

目标使用定时器添加敌机设计Enemy类1.使用定时器添加敌机敌机出现出现的规律&#xff1a;游戏启动后&#xff0c;每隔1秒会出现一架敌机每架敌机向屏幕下方飞行&#xff0c;飞行速度各不相同每架敌机出现的水平位置也不尽相同当敌机从屏幕下方飞出&#xff0c;不会再飞回到屏幕…

常见的历史漏洞之 weblogic+ Thinkphp5

数据来源 本文仅用于信息安全的学习&#xff0c;请遵守相关法律法规&#xff0c;严禁用于非法途径。若观众因此作出任何危害网络安全的行为&#xff0c;后果自负&#xff0c;与本人无关。 01 Weblogic相关介绍 》Weblogic介绍 》Weblogic特征 》历史漏洞 02 Weblogic漏洞利…

代码覆盖率工具OpenCppCoverage在Windows上的使用

OpenCppCoverage是用在Windows C上的开源的代码覆盖率工具&#xff0c;源码地址为https://github.com/OpenCppCoverage/OpenCppCoverage &#xff0c;最新发布版本为0.9.9.0&#xff0c;License为GPL-3.0。 从https://github.com/OpenCppCoverage/OpenCppCoverage/releases 下载…

python制作贪吃蛇小游戏,畅玩无限制

前言 大家早好、午好、晚好吖 ❤ ~ 现在这年头&#xff0c;无论玩个什么游戏都有健康机制&#xff0c; 这让我们愉悦玩游戏得步伐变得承重起来&#xff0c; 于是无聊之下我写了个贪吃蛇小游戏&#xff0c;来玩个快乐 代码展示 导入模块 import random import sys import …

关于一笔画问题的一些思考(欧拉路Fleury算法、逐步插入回路法、以及另一种可能的解法)

前言这是一个经典的图论问题了最近复习离散的时候又恰好看到了&#xff0c;发现自己以前的解法似乎有点bug然后开始出反例卡自己&#xff0c;结果发现卡不掉&#xff1f;然后再好好想了想&#xff0c;发现这个看起来有问题的做法可能确实没问题。注意&#xff1a;欧拉路、欧拉回…

透射式光电对管测量脉搏硬件电路设计

目录 前言 一、脉搏测量方法 二、脉搏测量原理 2.1 脉搏信号处理整体电路 2.2 信号采集电路 2.3 信号放大电路 2.4 波形整形电路 总结 前言 脉搏测量仪的设计是通过检测心跳的血液变化&#xff0c;产生不同的反射信号&#xff0c;用传感器将脉搏的跳动转换为电信号&…

Servlet实现表白墙

目录 一、表白墙简介 二、代码实现 1、约定前后端交互的接口 2、后端代码实现 3、前端代码实现 三、效果演示 一、表白墙简介 在表白墙页面中包含三个文本框&#xff0c;分别表示表白者&#xff0c;表白对象&#xff0c;表白内容&#xff0c;在文本框中输入内容之后&…

基于Web Speech API给ChatGPT加上语音功能,距离MOSS又近了一步

目录 前言 起步 实现过程 webkitSpeechRecognition speechSynthesis 小例子 遇到的问题 效果展示 总结 前言 去年写了两篇关于接入ChatGPT的文章&#xff1a;微信接入ChatGPT&#xff0c;使用NodeChatGPTWechaty做一个微信机器人_DieHunter1024的博客-CSDN博客 站在巨…

ChatGPT接入个人微信企业微信(国内通用)

ChatGPT近期以强大的对话和信息整合能力风靡全网&#xff0c;可以写代码、改论文、讲故事&#xff0c;几乎无所不能&#xff0c;这让人不禁有个大胆的想法&#xff0c;能否用他的对话模型把我们的微信打造成一个智能机器人&#xff0c;可以在与好友对话中给出意想不到的回应&am…

controller-runtime源码学习

本文基于controller-runtime v0.11.2版本进行源码学习 kubebuilder、operator-sdk这些框架都是在controller-runtime基础上做了一层封装&#xff0c;方便开发者快速生成项目的脚手架&#xff0c;本文会以kuebuilder搭建工程作为使用controller-runtime的demo进行源码分析 1、k…

paddle表情识别部署

表情识别模块1.环境部署1.1同样采用fastDeploy库1.2相关模型2.封装成静态库2.1参考[百度Paddle中PP-Mattingv2的部署并将之封装并调用一个C静态库](https://blog.csdn.net/weixin_43564060/article/details/128882099)2.2项目依赖添加2.3生成成功3.test3.1创建emotion_test项目…

多传感器融合定位十二-基于图优化的建图方法其一

多传感器融合定位十二-基于图优化的建图方法其一1. 基于预积分的融合方案流程1.1 优化问题分析1.2 预积分的作用1.3 基于预积分的建图方案流程2. 预积分模型设计3. 预积分在优化中的使用3.1 使用方法3.2 残差设计3.3 残差雅可比的推导3.3.1 姿态残差的雅可比3.3.2 速度残差的雅…

Python3.10新特性之match语句示例详解

这篇文章主要为大家介绍了Python3.10新特性之match语句示例详解&#xff0c;有需要的朋友可以借鉴参考下&#xff0c;希望能够有所帮助&#xff0c;祝大家多多进步&#xff0c;早日升职加薪正文在Python 3.10发布之前&#xff0c;Python是没有类似于其他语言中switch语句的&…

Clip-path实现按钮流动边框动画

前言 &#x1f44f;Clip-path实现按钮流动边框动画&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现步骤 添加div标签 <div>苏苏_icon</div>添加样式 div {position: relative;width: 220px;height: 6…

1947抓住那头牛(队列 广度优先搜索)

目录 题目描述 解析 解题思路 代码部分 代码部分 运行结果 看看len数组中各个位置的标记值 为什么这样做一定是最短路径&#xff1a; 题目描述 农夫知道一头牛的位置&#xff0c;想要抓住它。农夫和牛都位于数轴上&#xff0c;农夫起始位于点N(0<N<100000)&…

Java八股文(Java面试题)

JDK、JRE、JVM 三者之间的关系&#xff1f;JDK&#xff08;Java Development Kit&#xff09;&#xff1a;是Java开发工具包&#xff0c;是整个Java的核心&#xff0c;包括了Java运行环境JRE、Java工具和Java基础类库。它能够创建和编译程序。JRE&#xff08;Java Runtime Envi…

MySQL-字符集和比较规则

在计算机中只能存储二进制数据&#xff0c;那该怎么存储字符串呢&#xff1f;当然是建立字符与二进制数据的映射关系 了&#xff0c;建立这个关系最起码要搞清楚两件事&#xff1a; 界定清楚字符范围&#xff1a;需要把哪些字符映射成二进制数据&#xff1f;编码与解码&#x…

九龙证券|外资强势出手!这只科创板百元股,被疯狂加仓

本周&#xff0c;北上资金净买入29.32亿元&#xff0c;连续第13周加仓A股。分商场看&#xff0c;北上资金加仓重点倾向于沪市的白马蓝筹股&#xff0c;沪股通取得50.34亿元&#xff0c;深股通则被净卖出21.02亿元。 食品饮料本周取得逾23亿元的增持&#xff0c;居职业首位&…

leaflet 读取上传的geojson文件,转换为wkt文件(057)

第057个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中上传geojson文件,解析geojson文件并转换为WKT,并在地图上显示图片。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果. 文章目录 示例效果配置方式示例源代码(共128行)安装 @terraf…