Java 哈希表

一、哈希表的由来

我们的java程序通过访问数据库来获取数据,但是当我们对数据库所查询的信息进行大量分析后得知,我们要查询的数据满足二八定律,一般数据库的数据基本存储在磁盘当中。这使得每次查询数据将变得无比缓慢。为此我们可以将经常查询的数据放置在内存当中,在内存当中设置缓存,我们java程序先去缓存当中去查询数据,这样将大大节省我们的数据查询时间。

缓存可以分为两种一种是市面上的存储产品,例如redis.也或者我们自己可以开发一个缓存(哈希表)。

二、哈希表的数据结构

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

散列函数:是用来确定我们每一个值得存储在哪一个链表之上。

三、为了了解什么是哈希表

我们先来看如下的一道题:

有一个公司,当有新的员工来报道时,需要将该员工的信息加入(id,性别,年龄,住址,...),当输入该用户id时,需要查询到该员工的所有信息。

要求:不使用数据库,尽量节省内存,速度越快越好 --> 哈希表

分析清楚上边的题以后我们来用代码将其实现。

首先分析这个代码有哪些组成。

根据拆分我们可以知道一个哈希表是由节点组成链表,每一个链表都存放在数据当中的每个节点当中,如下图。

代码实现

主要代码

/*** 定义该类表示一个雇员*/
public class Employee {public int id;public String name;public Employee next; // next默认为空//定义构造函数public Employee(int id, String name) {this.id = id;this.name = name;}
}
/*** 定义该类表示链表*/
public class EmpLiskedList {// 定义头指针,指向第一个Emp对象public Employee head;/*** 添加雇员到链表* 说明:* 我们这个方法采用的是尾插法将新插入的数据放置到尾部* 1.判断头指针是否为空* 2.如果不是第一个雇员,则使用一个辅助指针,帮助定位到最后* @param employee*/public void add(Employee employee){//判断头指针是否为空if(head == null){head = employee;return;}//如果不是第一个雇员,则使用一个辅助指针,帮助定位到最后Employee tempEmp = head;while (true){if(tempEmp.next == null){ //说明链表到了最后break;}tempEmp = tempEmp.next; //后移}//将employee加入到链表tempEmp.next = employee;}/*** 遍历链表的雇员信息* 说明:* 1. 首先需要判断链表是否为空* 2. 借助辅助指针进行遍历* @param i 这是第几条链表*/public void list(int i){if(head == null){ // 说明链表为空System.out.println("链表为空");return;}//定义一个值表示链表的大小和int count = 1;//定义辅助指针Employee tempEmp = head;while (true){System.out.println("id:="+tempEmp.id+" "+"name:="+tempEmp.name);//判断是否到了最后节点if(tempEmp.next == null){System.out.println("这是第"+i+"条链表,长度为"+count);break;}tempEmp = tempEmp.next;//后移count ++;}}}
/*** 该类的主要作用是管理散列表*/
public class HashTab {// 定义散列表private EmpLiskedList[] empLiskedListArray;//定义散列表的大小private int size;// 构造器public HashTab(int size){this.size = size;//初始化empLiskedListArrayempLiskedListArray = new EmpLiskedList[size];// 一个小坑,这个地方不要忘记分别初始化每个链表,// 我们的散列表当中每个位置还是空的for (int i=0;i<size;i++){empLiskedListArray[i] = new EmpLiskedList();}}//编写散列函数,使用一个简单取模法public int hash(int id){return id % size;}// 添加雇员public void add(Employee employee){//根据员工的id,得到该员工应该添加到那一条链表int num = hash(employee.id);// 将emp添加到对应的链表当中去empLiskedListArray[num].add(employee);}//遍历所有的链表,遍历hashtablepublic void list(){for (int i=0;i<size;i++){empLiskedListArray[i].list(i);}}}

测试类

public class Test {public static void main(String[] args) {HashTab hashTab = new HashTab(8);Employee employee1 = new Employee(1,"张三1");Employee employee2 = new Employee(4,"张三4");Employee employee3 = new Employee(6,"张三6");Employee employee4 = new Employee(8,"张三8");Employee employee5 = new Employee(10,"张三10");Employee employee6 = new Employee(11,"张三11");Employee employee7 = new Employee(15,"张三15");Employee employee8 = new Employee(16,"张三16");Employee employee9 = new Employee(18,"张三18");Employee employee10 = new Employee(20,"张三20");hashTab.add(employee1);hashTab.add(employee2);hashTab.add(employee3);hashTab.add(employee4);hashTab.add(employee5);hashTab.add(employee6);hashTab.add(employee7);hashTab.add(employee8);hashTab.add(employee9);hashTab.add(employee10);hashTab.list();}
}

 谢谢你的阅读,点个赞吧!

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

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

相关文章

vue实现验证码验证登录

先看效果&#xff1a; 代码如下&#xff1a; <template><div class"container"><div style"width: 400px; padding: 30px; background-color: white; border-radius: 5px;"><div style"text-align: center; font-size: 20px; m…

算法打卡day36|动态规划篇04| 01背包理论基础、416. 分割等和子集

目录 01背包理论基础 01背包问题描述 01背包解法 二维数组 一维数组 算法题 Leetcode 416. 分割等和子集 个人思路 解法 动态规划 01背包理论基础 不同的背包种类&#xff0c;虽然有那么多中南背包&#xff0c;但其中01背包和完全背包是重中之重&#xff1b; 01背包问…

智能感应门改造工程

今天记录一下物联网专业学的工程步骤及实施过程 智能感应门改造工程 1 规划设计1.1 项目设备清单1.2项目接线图 软件设计信号流 设备安装与调试工程函数 验收 1 规划设计 1.1 项目设备清单 1.2项目接线图 软件设计 信号流 设备安装与调试 工程函数 工程界面: using System; …

银行监管报送系统介绍(十五):金融审计平台

《“十四五”国家审计工作发展规划》中重点强调&#xff0c;金融审计&#xff1a;以防范化解重大风险、促进金融服务实体经济&#xff0c;推动深化金融供给侧结构性改革、建立安全高效的现代金融体系为目标&#xff0c;加强对金融监管部门、金融机构和金融市场运行的审计。 —…

蓝奏云直链获取在线解析网站源码

源码简介 蓝奏云直链获取在线解析网站源码 蓝奏云链接解析 本地API接口 支持有无密码和短期直链和永久直链&#xff0c;同时还可以显示文件名和大小。 这个解析器无需数据库即可搭建&#xff0c;API接口已经本地化&#xff0c;非常简单易用。 安装环境 php5.6 搭建教程 …

多功能echarts柱状图

数据结构: data = [{name: 类别1,value: 15,children: [{name: 项目1-1,value: 87,value2: 3.3,},{name: 项目1-2,value: 80,value2: 2.6,},{name: 项目1-3,value: 79,value2: 3.8,},]},{name: 类别2,value: 15,children: [{name: 项目2-1,value: 70,value2: 1.5,},{name: 项…

【数据结构】红黑树详解

目录 前言&#xff1a; 红黑树的概念&#xff1a; 红黑树的性质: 红黑树节点的定义&#xff1a; 红黑树的插入&#xff1a; 情况1&#xff1a;cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u存在且为红 情况2&#xff1a;cur为红&#xff0c;p为红&#xff0c…

【Java EE】关于Maven

文章目录 &#x1f38d;什么是Maven&#x1f334;为什么要学Maven&#x1f332;创建⼀个Maven项目&#x1f333;Maven核心功能&#x1f338;项目构建&#x1f338;依赖管理 &#x1f340;Maven Help插件&#x1f384;Maven 仓库&#x1f338;本地仓库&#x1f338;私服 ⭕总结 …

电商平台混战之下,天猫破解品牌增长奥秘

行业共识是追上风&#xff0c;才有好生意&#xff0c;但风很多时候不会只有一个方向。 4月2日&#xff0c;上海&#xff0c;TopTalk 2024天猫超级品牌私享会举行。这个活动已举办数年&#xff0c;每一年天猫都会发布新一年度的品牌经营策略&#xff0c;只是与往年不同的是&…

从零开始学起!全方位解析App压力测试的关键要点!

简介 Monkey 是 Google 提供的一个用于稳定性与压力测试的命令行工具 可以运行在模拟器或者实际设备中 它向系统发送伪随机的用户事件对软件进行稳定性与压力测试 为什么要用 Monkey Monkey 就是像猴子一样上蹿下跳地乱点 为了测试软件的稳定性&#xff0c;健壮性 随机点…

区间概率预测python|QR-CNN-BiLSTM+KDE分位数-卷积-双向长短期记忆神经网络-时间序列区间概率预测+核密度估计

区间预测python|QR-CNN-BiLSTMKDE分位数-卷积-双向长短期记忆神经网络-核密度估计-回归时间序列区间预测 模型输出展示&#xff1a; (图中是只设置了20次迭代的预测结果&#xff0c;宽度较宽&#xff0c;可自行修改迭代参数&#xff0c;获取更窄的预测区间&#xff09; 注&am…

2012年认证杯SPSSPRO杯数学建模D题(第一阶段)人机游戏中的数学模型全过程文档及程序

2012年认证杯SPSSPRO杯数学建模 D题 人机游戏中的数学模型 原题再现&#xff1a; 计算机游戏在社会和生活中享有特殊地位。游戏设计者主要考虑易学性、趣味性和界面友好性。趣味性是本质吸引力&#xff0c;使玩游戏者百玩不厌。网络游戏一般考虑如何搭建安全可靠、丰富多彩的…

汇编语言:寻址方式在结构化数据访问中的应用——计算人均收入

有一年多没有在CSDN上发博文了。人的工作重心总是有转移的&#xff0c;庆幸一直在做着有意义的事。   今天的内容&#xff0c;是为汇编语言课程更新一个实验项目。      本方案修改自王爽编《汇编语言》第&#xff14;版P172“实验7寻址方式在结构化数据访问中的应用” …

微软推出GPT-4 Turbo优先使用权:Copilot for Microsoft 365商业用户享受无限制对话及增强图像生成能力

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

【Apache Doris】周FAQ集锦:第 1 期

【Apache Doris】周FAQ集锦&#xff1a;第 1 期 SQL问题数据操作问题运维常见问题其它问题关于社区 欢迎查阅本周的 Apache Doris 社区 FAQ 栏目&#xff01; 在这个栏目中&#xff0c;每周将筛选社区反馈的热门问题和话题&#xff0c;重点回答并进行深入探讨。旨在为广大用户和…

【单】Unity _RPG项目中的问题

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a; ⭐…

【Error】Uncaught TypeError: Cannot read properties of undefined (reading ‘get’)

报错原因&#xff1a; 返回值为undefined 解决&#xff1a; vue3可用&#xff1f;

echarts实现炫酷科技感的流光效果

前言&#xff1a; echarts实现炫酷科技感的流光效果 效果图&#xff1a; 实现步骤&#xff1a; 1、引入echarts,直接安装或者cdn引入 npm i echarts https://cdn.jsdelivr.net/npm/echarts5.4.3/dist/echarts.min.js 2、封装 option方法&#xff0c;第一个数据是折线数据&a…

面试:HashMap

目录 1、底层数据结构&#xff0c;1.7 与1.8有何不同? 2、为何要用红黑树&#xff0c;为何一上来不树化&#xff0c;树化阈值为何是8&#xff0c;何时会树化&#xff0c;何时会退化为链表? 3、索引如何计算? hashCode都有了&#xff0c;为何还要提供hash()方法?数组容量为…

AJAX —— 学习(三)(完结)

目录 一、jQuery 中的 AJAX &#xff08;一&#xff09;get 方法 1.语法介绍 2.结果实现 &#xff08;二&#xff09;post 方法 1.语法介绍 2.结果实现 &#xff08;三&#xff09;通用型的 AJAX 方法 1.语法介绍 2.结果实现 二、AJAX 工具库 axios &#xff08…