关于哈希表

news2025/3/11 3:08:09
package com.javase.map.hashmap;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 关于HashMap:
 *     1.HashMap集合的底层是哈希表/散列表的数据结构。
 *     2.哈希表是数组和单向链表的结合体,充分发挥了它们各自的优点。
 *     3.HashMap集合底层源代码:
 *        public class HashMap{
 *            Node<K,V>[] table;//说明底层是一个一维数组
 *            //静态内部类HashMap.Node
 *            static class Node<K,V>{
 *                final int hash;//哈希值:是key的hashCode()方法执行的结果
 *                final K key;//存储到Map集合中的那个key。
 *                V value;//存储到Map集合中的那个value
 *                Node<K,V> next;//下一个节点的内存地址。
 *            }
 *        }
 *        哈希表/散列表:就是一维数组,在这个一维数组中每一个元素都是一个单向链表(数组和链表的结合体)
 *    4.最主要需要掌握的是:
 *        map.put(k,v);
 *        v = map.get(k);
 *        以上两个方法的实现原理,是必须掌握的。(哈希表的数据结构和put和get执行原理见下图)
 *    5.HashMap集合的key部分特点:
 *        无序不可重复
 *        为什么无序?因为元素不一定放到哪个单向链表上。
 *        不可重复是如何保证的? equals()方法保证HashMap集合的key不可重复。如果key重复了,value会覆盖。
 *
 *        放到HashSet集合中的元素实际上是放到了HashMap集合的key部分了,
 *        所有HashSet和HashMap集合中的元素都需要重写hashCode()和equals()方法
 *    6.假设将所有的hashCode()方法返回值固定为某个值,哈希表会变成单向链表,这种情况我们称为:散列分布不均匀。
 *      假设将所有的hashCode()方法返回值都设定为不一样的值,哈希表会变成一维数组,就没有了链表的概念。也叫散列分布不均匀。
 *
 *      若要散列分布均匀需要你重写hashCode()方法时有一定的技巧。
 *
 *    7.重点:HashSet集合中的元素和放到HashMap集合中key部分的元素需要同时重写hashCode()和equals()方法.
 *    8.HashMap集合的默认初始化容量是16,默认加载因子是0.75.
 *          意思是:当HashMap集合底层数组的容量达到75%的时候数组开始扩容。新容量是原容量的2倍。
 *
 *          需要记住:HashMap集合的初始化容量必须是2的倍数,这是官方推荐的,为了达到散列分布均匀,提高集合的存取效率。
 *
 *          有一个名词叫"哈希碰撞"意思是说:两个不相同的哈希值转换成的数组下标有可能相同。这种情况叫“哈希碰撞”
 *
 *    9.最终结论:放到HashSet与HashMap集合中的元素必须同时重写hashCode()与equals()方法。这两个方法不需要自己写,只需要利用
 *               IDEA工具自动同时生成即可。(无论你是否掌握哈希表是数据结构和原理,这一点必须记住)
 */
public class HashMapText {
    public static void main(String[] args) {
//        测试HashMap集合中key部分元素的特点(无序不可重复)
//        创建集合
//        集合中key部分元素采用Integer类型,Integer类型中hashCode()和equals()方法都已经重写了。
        Map<Integer,String> map = new HashMap();
//        向集合中添加元素
        map.put(11,"张三");
        map.put(55,"李四");
        map.put(77,"王五");
        map.put(66,"赵柳");
        map.put(66,"小明");

//        查看集合中元素的个数
        System.out.println(map.size());//4。key重复,value覆盖。因为有6666是重复的,所以对应的value被覆盖了
//        遍历集合
//        将Map集合转变成Set集合
        Set<Map.Entry<Integer,String>> set = map.entrySet();
//        使用增强for来遍历集合
        for (Map.Entry<Integer,String> node : set) {
            System.out.println(node.getKey() + "=" + node.getValue());
        }
    }
}
/*
输出结果:
        66=小明   取出顺序和存入顺序不同,叫无序;存放了两个"66",最后只保存了最后一个"66",前面的被后面的覆盖了这叫不可重复。
        55=李四
        11=张三
        77=王五
*/

                                         哈希表的数据结构和put和get执行原理

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

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

相关文章

【机器学习】三种主要集成学习思想简介

集成学习 集成学习通过训练多个分类器,然后将其组合起来,从而达到更好的预测性能,提高分类器的泛化能力。 目前集成学习有3个主要框架:bagging、boosting、stacking。 bagging套袋法 bagging是并行集成学习方法的最著名代表,其算法过程如下: 从原始样本集中抽取训练…

【云原生进阶之容器】第一章Docker核心技术1.8节——DockerFile解析

1 Dockfile详解 1.1 什么是Dockerfile 首先通过一张图来了解 Docker 镜像、容器和 Dockerfile 三者之间的关系。 通过上图可以看出使用 Dockerfile 定义镜像,运行镜像启动容器。 Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文…

技术分享 | 黑盒测试方法论—场景法

场景法就是模拟用户操作软件时的场景&#xff0c;主要用于测试系统的业务流程。 测试不能只关注某个控件的边界值、等价类是否满足要求&#xff0c;也要关注它的主要功能和业务流程是否正确实现&#xff0c;这时就需要使用场景法来完成。 场景法 用例场景是用来描述流经用例路…

OpenHarmony 物联网设备开发环境搭建

前言 我们介绍的是华为官方推荐的 Windows + Ubuntu 混合开发的环境,使用Windows平台的DevEco Device Tool 进行可视化界面进行相关操作,通过远程连接的方式对接Ubuntu下的DevEco Device Tool,然后对Ubuntu下的源码进行开发、编译、烧录等操作。 目前官方不支持Mac系统,所…

【docker】什么是容器数据卷?

docker的理念回顾 将应用和环境打包成一个镜像&#xff01; 数据&#xff1f;如果数据都在容器中&#xff0c;那么我们容器删除&#xff0c;数据就会丢失&#xff01;需求&#xff1a;数据可以持久化 MySQL&#xff0c;容器删了&#xff0c;删库跑路&#xff01;需求&#x…

测试工具平台 MeterSphere 分享

一、官网地址 meterSphere 二、安装方式 Linux安装 默认账号密码&#xff1a; URL: http://$LOCAL_IP:8081用户名: admin初始密码: metersphere三、nginx配置 直接上配置 location / {proxy_pass http://localhost:8081;client_max_body_size 1000m;#access_log off;# 配…

SPDK代码结构浅析

最近这三周时间一直因为工作的需要在研究SPDK移植到RISCV平台上&#xff0c;在编译通过的时候&#xff0c;也顺带把SPDK的代码粗粗过了一遍&#xff0c;顺便做了一点笔记。 SPDK (Storage Performance Development Kit)其实就是在用户空间&#xff0c;采用轮询的方式无锁的NVM…

通达信下单接口获取指数成份股的步骤分享

通达信下单接口获取指数成份股的步骤分享&#xff1a; ContextInfo.get_sector() 接口&#xff1a;https://gitee.com/metatradeapi 用法&#xff1a; ContextInfo.get_sector(sector, realtime) 释义&#xff1a; 获取板块成份股&#xff0c;只支持取指数成份股 参数&…

DOM学习笔记(坚持~~~~)

1.DOM简介 1.1什么是DOM 文档对象模型简称DOM&#xff0c;W3C组织推荐的处理可扩展标记语言的标准编程接口&#xff0c;通过这些DOM接口可以改变网页的内容&#xff0c;结构和样式。 1.2 DOM树 文档&#xff1a;一个页面就是一个文档&#xff0c;DOM中使用document表示 元素&…

Python+Qt身体特征识别人数统计源码窗体程序

程序示例精选 PythonQt身体特征识别人数统计 如需安装运行环境或远程调试&#xff0c;见文章底部微信名片&#xff0c;由专业技术人员远程协助&#xff01; 前言 这篇博客针对《PPythonQt身体特征识别人数统计》编写代码&#xff0c;功能包括了相片&#xff0c;摄像头身体识别…

Javaweb中的Request(请求)和Response(响应)

目录 一、概念 二、请求&#xff08;Request&#xff09; 1.例子简介 2.Request继承体系 3.Request获取请求数据 &#xff08;1&#xff09;请求行 &#xff08;2&#xff09;请求头 &#xff08;3&#xff09;请求体 4.优化请求体参数的获取 5.解决请求参数乱码问…

POSIX Timer

一、特点&#xff1a; 1、使用 POSIX Timer&#xff0c;一个进程可以创建任意多个 Timer。 2、setitmer 计时器时间到达时&#xff0c;可以有多种通知方式&#xff0c;比如信号&#xff0c;或者启动线程。 3、POSIX Timer 则可以使用实时信号。 4、POSIX Timer 是针对有实时要…

leetcode98. 验证二叉搜索树关于递归实现中遇到的global和nonlocal(各种报错分析)

leetcode98. 验证二叉搜索树 题目 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二…

前端基础(十三)_定位position、定位层级z-index

一、定位position Css的定位机制&#xff1a;普通文档流、浮动、定位 这里主要介绍CSS的定位属性&#xff1a;position&#xff1a; 1、定位原理&#xff1a;允许元素相对于正常位置、或者相对于父元素、浏览器窗口本上的位置 2、元素位置的调整&#xff1a; left|right属性、…

Spring Boot项目使用RabbitMQ队列

Spring Boot项目使用RabbitMQ队列 一、Rabbitmq的安装 RabbitMQ是一个开源的遵循 AMQP协议实现的基于 Erlang语言编写&#xff0c;**即需要先安装部署Erlang环境再安装RabbitMQ环境。 erlang的安装在windows中直接点击安装即可。 安装完erlang后设置erlang的环境变量ERLANG…

CSM32RV20 是 32位低功耗MCU芯片 RISC-V RV32IMAC 内核

CSM32RV20 是 32位低功耗MCU芯片 RISC-V RV32IMAC 内核 CSM32RV20 是基于RISC-V RV32IMAC 内核&#xff08;2.6 CoreMark/MHz&#xff09;的32位低功耗MCU芯片&#xff0c;最高主频32MHz&#xff0c;最大支持 40KB 嵌入式FlASH、4KB SRAM和512B NVM&#xff0c;集成ADC和UART、…

如何使用FastReport .NET 从 JetBrains Rider 中创建PDF报告?

Fastreport是目前世界上主流的图表控件&#xff0c;具有超高性价比&#xff0c;以更具成本优势的价格&#xff0c;便能提供功能齐全的报表解决方案&#xff0c;连续三年蝉联全球文档创建组件和库的“ Top 50 Publishers”奖。 FastReport.NET官方版下载&#xff08;qun&#x…

了解什么是架构基本概念和架构本质

什么是架构和架构本质 在软件行业&#xff0c;对于什么是架构&#xff0c;都有很多的争论&#xff0c;每个人都有自己的理解。此君说的架构和彼君理解的架构未必是一回事。因此我们在讨论架构之前&#xff0c;我们先讨论架构的概念定义&#xff0c;概念是人认识这个世界的基础&…

Note that you can also install from a tarball 处理

近期使用 npm publish 发布依赖包时&#xff0c;始终遇到 npm 404 报错&#xff0c;错误信息是 “Note that you can also install from a tarball”&#xff0c;尝试更换网络&#xff0c;更换代理服务器等操作&#xff0c;都无效&#xff0c;npm 报错如下 问题原因&#xff1a…

python通过字典来替代if..else

在应对多策略的场景下&#xff0c;大量使用if...else...不仅提高了后期的维护成本&#xff0c;还降低了运行效率。通过字典做映射就可以更好的优化代码。 比如这样一个模拟场景&#xff0c;根据用户的VIP等级&#xff0c;发放奖励。在大量使用if...else...时就会变成如下状态&…