java之哈希表

  • 哈希表的用法
  • 运行结果

文章内容选自尚硅谷数据结构和算法,jdk11,eclipse环境

哈希表的用法

哈希表是一个链表数组,首先创建一个数组,数组的每一个元素都是链表的头结点,这儿链表的头结点直接存放第一个节点,而不是像之前的单链表一样,头结点指向第一个节点。

本文完成了原视频布置的作业,增加了删除节点的环节。

  • 哈希表的存放顺序是按照每一个节点的关键码值(key value),节点的关键码值决定该节点存放在哪一个链表中。
  • 哈希表单独作为一个对象(HashTab),当对哈希表作增删改查的时候,直接调用哈希表内的增删改查方法即可。要实现这一步,需要先创建一个链表对象(EmpLinkedList),当对哈希表作增删改查的时候,哈希表对象HashTab先根据key value找到要操作对象的链表位置,然后调用聊表对象EmpLinkedList的方法,对链表作增删改查。
  • 使用哈希表的优点是可以通过内存来操作数据,而避免采用数据库来操作数据,减轻数据库负担,增快了对数据的操作速度。
  • 哈希表可以做多级缓存。

代码演示如下:

package com.atguigu.hashtab;import java.util.Scanner;public class HashTabDemo {public static void main(String[] args) {HashTab hashTab = new HashTab(7);String key = "";Scanner scanner = new Scanner(System.in);while(true) {System.out.println("输入add添加员工");System.out.println("输入list查看员工");System.out.println("输入find查找员工");System.out.println("输入exit退出系统");System.out.println("输入del删除员工");key = scanner.next();switch(key) {case "add":System.out.println("请输入新员工的id");int id = scanner.nextInt();System.out.println("请输入新员工的name");String name = scanner.next();Emp tmp = new Emp(id,name);hashTab.addEmp(tmp);break;case "list":hashTab.listEmp();break;case "find":System.out.println("请输入要查找员工的id");int id2 = scanner.nextInt();hashTab.findId(id2);break;case "exit":scanner.close();System.exit(0);case "del":System.out.println("请输入要删除员工的id");int id3 = scanner.nextInt();hashTab.delId(id3);break;default:System.out.println("输入错误,请重新输入");}}}}class Emp{int id;String name;Emp next;public Emp(int id, String name) {super();this.id = id;this.name = name;}}class EmpLinkedList{private Emp head;public void add(Emp emp) {if(head == null) {head = emp;  //直接把要添加的对象复制给head,不保留头指针return;}Emp curEmp;curEmp = head;while(curEmp.next != null) {curEmp = curEmp.next;}curEmp.next = emp;}public void list(int i) {if(head == null) {System.out.println("第"+(i+1)+"条链表为空");return;}Emp curEmp = head;while(curEmp.next != null) {System.out.printf("=>id = %d,name = %s\t",(curEmp.id),curEmp.name);curEmp = curEmp.next;}System.out.printf("=>id = %d,name = %s\t",(curEmp.id),curEmp.name);System.out.println();}public void findEmp(int id) {Emp curEmp = head;if(curEmp == null) {System.out.println("链表空,没有找到");return;}while(true) {if(curEmp.id == id) {System.out.println("找到了,name = "+curEmp.name);return;}if(curEmp.next == null) {curEmp = null;System.out.println("没有找到");return;}curEmp = curEmp.next;}}public void delEmp(int id) {Emp curEmp;curEmp = head;if(curEmp == null) {System.out.println("链表空,无法删除");return;}while(true) {if(curEmp.next== null) {if(curEmp == head && curEmp.id == id) {head = null;return;}else {System.out.println("没有找到要删除的id");return;}}if(curEmp.id == id && curEmp == head) {head = curEmp.next;return;}if(curEmp.next.id == id) {if(curEmp.next.next != null) {curEmp.next = curEmp.next.next;System.out.println("已删除id");return;}else {curEmp.next = null;return;}}curEmp = curEmp.next;}
}
}class HashTab{EmpLinkedList[] empLinkedListArray ;int size;public HashTab(int size) {super();empLinkedListArray = new EmpLinkedList[size];this.size = size;for(int i = 0;i<empLinkedListArray.length;i++) {empLinkedListArray[i] = new EmpLinkedList();}}public int fun(int id) {return id % size;}public  void addEmp(Emp emp) {int empId = fun(emp.id);if(empId != 0)empLinkedListArray[empId-1].add(emp);elseempLinkedListArray[6].add(emp);}public void listEmp() {for(int i = 0;i < empLinkedListArray.length;i++) {empLinkedListArray[i].list(i);}}public void findId(int id) {int empId = fun(id);if(empId != 0)empLinkedListArray[empId-1].findEmp(id);elseempLinkedListArray[6].findEmp(id);}public void delId(int id) {int empId = fun(id);if(empId != 0)empLinkedListArray[empId-1].delEmp(id);elseempLinkedListArray[6].delEmp(id);}}

运行结果

输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
add
请输入新员工的id
7
请输入新员工的name
asgd
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
add
请输入新员工的id
21
请输入新员工的name
asgdag
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
add
请输入新员工的id
14
请输入新员工的name
agah
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
lilst
输入错误,请重新输入
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
list
第1条链表为空
第2条链表为空
第3条链表为空
第4条链表为空
第5条链表为空
第6条链表为空
=>id = 7,name = asgd =>id = 21,name = asgdag =>id = 14,name = agah
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
del
请输入要删除员工的id
7
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
list
第1条链表为空
第2条链表为空
第3条链表为空
第4条链表为空
第5条链表为空
第6条链表为空
=>id = 21,name = asgdag =>id = 14,name = agah
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
del
请输入要删除员工的id
14
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
list
第1条链表为空
第2条链表为空
第3条链表为空
第4条链表为空
第5条链表为空
第6条链表为空
=>id = 21,name = asgdag
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
del
请输入要删除员工的id
21
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
asdgg
输入错误,请重新输入
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
del
请输入要删除员工的id
21
链表空,无法删除
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
list
第1条链表为空
第2条链表为空
第3条链表为空
第4条链表为空
第5条链表为空
第6条链表为空
第7条链表为空
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
add
请输入新员工的id
7
请输入新员工的name
asg
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
list
第1条链表为空
第2条链表为空
第3条链表为空
第4条链表为空
第5条链表为空
第6条链表为空
=>id = 7,name = asg
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
del
请输入要删除员工的id
7
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
list
第1条链表为空
第2条链表为空
第3条链表为空
第4条链表为空
第5条链表为空
第6条链表为空
第7条链表为空
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
add
请输入新员工的id
1
请输入新员工的name
ahha
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
add
请输入新员工的id
4
请输入新员工的name
aahga
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
add
请输入新员工的id
7
请输入新员工的name
agha
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
add
请输入新员工的id
8
请输入新员工的name
ahahfa
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
llist
输入错误,请重新输入
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
list
=>id = 1,name = ahha =>id = 8,name = ahahfa
第2条链表为空
第3条链表为空
=>id = 4,name = aahga
第5条链表为空
第6条链表为空
=>id = 7,name = agha
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
del
请输入要删除员工的id
1
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
list
=>id = 8,name = ahahfa
第2条链表为空
第3条链表为空
=>id = 4,name = aahga
第5条链表为空
第6条链表为空
=>id = 7,name = agha
输入add添加员工
输入list查看员工
输入find查找员工
输入exit退出系统
输入del删除员工
exit

java之hashTab相关推荐

  1. Java之HashTab基本用法

    表示一个雇员 public class Emp {public int id;public String name;public Emp next;//next 默认为 nullpublic Emp( ...

  2. JAVA 基本数据结构--数组、链表、ArrayList、Linkedlist、hashmap、hashtab

    JAVA 基本数据结构(转载) --数组.链表.ArrayList.Linkedlist.hashmap.hashtab

  3. HashTab基于链表简单实现(java,不包含扩容)

    一.文件目录 二.代码 /*** 定义一个雇员*/ public class Emp {public int id;public String name;//默认为nullpublic Emp nex ...

  4. JAVA 基本数据结构--数组、链表、ArrayList、Linkedlist、hashmap、hashtab等

    概要 线性表是一种线性结构,它是具有相同类型的n(n≥0)个数据元素组成的有限序列.本章先介绍线性表的几个基本组成部分:数组.单向链表.双向链表:随后给出双向链表的C.C++和Java三种语言的实现. ...

  5. java的concurrenthashmap和hashtab

    一.背景: 线程不安全的HashMap 因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap. 效率低下的HashTab ...

  6. java hashtable 数据结构_数据结构--哈希表(Java)

    数据结构--哈希表(Java) 介绍 哈希表 底层是 数组加链表 或者是 数组加二叉树 ,一个数组里面有多个链表,通过散列函数来提高效率 代码 package cn.guizimo.hashtab; ...

  7. Java集合List、Set、Map

    集合是 java 基础中非常重要的一部分,同样也是 Java 面试中很重要的一个知识点.所以,给王小整理了这篇关于集合的文章. 1.接口继承关系以及实现 集合类存放于 Java.util 包中,主要有 ...

  8. 【Java数据结构与算法】第十章 哈希表和二叉树

    第十章 哈希表和二叉树 文章目录 第十章 哈希表和二叉树 一.哈希表 1.介绍 2.代码实现 二.二叉树 1.介绍 2.遍历二叉树 3.查找二叉树 4.二叉树删除节点 5.二叉树综合实例 一.哈希表 ...

  9. Java 基础 第3阶段:高级应用——尚硅谷学习笔记(含面试题) 2023年

    Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 Java 基础 第 3 阶段:高级应用--尚硅谷学习笔记(含面试题) 2023 年 第 9 章 异常处理 9.1 异 ...

最新文章

  1. multiprocessing 多进程
  2. ubuntu下 mysql数据 自执行备份
  3. 在struts框架下实现文件的上传
  4. three.js制作3d模型工具_3D打印模型打磨抛光常用工具
  5. leetcode1471. 数组中的 k 个最强值(排序)
  6. matlab状态方程 传递函数 可控性,实验一matlab系统的传递函数和状态空间表达式的转换...
  7. JavaWeb之Servlet:Cookie 和 Session
  8. codeforces 463A Caisa and Sugar 解题报告
  9. 机器学习 深度学习 ai_什么是AI? 从机器学习到决策自动化
  10. PPT中如何制作遮罩动画效果
  11. 大电流dcdc降压芯片20a_基于MC34063芯片DC-DC(20-5)降压型变换电路
  12. 关于软件测试未来发展趋势分析与总结
  13. flask---》Marshmallow介绍及基础使用
  14. 9月25日百度大脑开放日人像特效专场火热报名中!
  15. 宏碁服务器u盘装系统,宏基笔记本用u盘装系统操作流程
  16. android apk 永久root,Android 实现永久性开启adb 的root权限
  17. web仿真或实际内存分析应用及自动化方案
  18. 命名空间“Microsoft.Office”中不存在类型或命名空间名称“Interop”(是缺少程序集引用吗?)...
  19. 关于 SecureFx传输远程服务器中文显示乱码 的解决方法
  20. 一文带你读懂Java字节码

热门文章

  1. 【01】什么是概率图模型?
  2. 2020形式化方法复习笔记
  3. python单曲循环播放MP3
  4. 从瑞银集团看客户导向型财富管理机构如何从资产配置服务中获利
  5. 正则表达式爬取红牛分公司数据
  6. R语言分组求和,分组求平均值,分组计数
  7. 有偿调查问卷赚钱攻略
  8. Asp.Net Core MVC 使用Aspose.Cells从Excel获取数据
  9. 【防坑指南】nginx重启后出现[error] open() “/usr/local/var/run/nginx/nginx.pid” failed
  10. 台式电子计算机内部电源的电压,电源知识:台式电脑电源中的+12V/+5V/+3.3V都为哪些硬件供电?(2)...