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. UEBA 学术界研究现状——用户行为异常检测思路:序列挖掘prefixspan,HMM,LSTM/CNN,SVM异常检测,聚类CURE算法...
  2. Lambda表达式——注重过程的编程思想
  3. 如何用Python探究你喜爱的歌手?大数据还是很厉害的
  4. 【逆向工具】使用x64dbg+spy去除WinRAR5.40(64位)广告弹框
  5. LoadRunner9 5新特性
  6. Centos7.9源码编译安装Apache
  7. 计算机组成原理与汇编语言程序设计课后答案,计算机组成原理与汇编语言程序设计(第4版)...
  8. 华为eNSP的基础入门实验
  9. Redhat注册下载Redhat Enterprise Linux Download
  10. R语言数据分析报告 鲍鱼年龄预测
  11. 公众平台模板消息所在行业_微信公众号模板消息群发常见问题汇总
  12. 离线安装openOffice
  13. Python3:批量读取excel百度分享链接保存到百度网盘
  14. confluence权限管理
  15. 年薪80万技术专家,面试通过后,被发现简历造假!合并8年前多段工作,惨遭警告和淘汰!
  16. 排序学习-必读论文-AMiner
  17. Mozilla里永久删除的邮件如何恢复
  18. 【SQL实战经验一】:SQL语句中存在英文的单引号、双引号问题
  19. iOS —— 触摸事件传递及响应与手势
  20. msm8909平台JEITA配置和bat-V therm表合入

热门文章

  1. 【小学信息技术教资面试】教案模板
  2. node.js集成sendgrid邮件发送及其它功能
  3. java学习笔记第三部分
  4. Excel单元格插入图片,并自适应宽高——保姆级教程
  5. 关于Arduino连接L298N供电问题
  6. 客户管理中如何管理好客户资料
  7. Java数组添加/扩容(基础---代码思路)
  8. VMware扩展Ubuntu分区容量大小
  9. eclipes使用方法
  10. 局部最优点+鞍点+学习率的调节