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

| 有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,名字,住址..),当输入该员工的id时,要求查找到该员工的所有信息 |

| 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: 退出系统"); |
| key = scanner.next(); |
| switch (key) { |
| case "add": |
| System.out.println("输入id"); |
| int id = scanner.nextInt(); |
| System.out.println("输入名字"); |
| String name = scanner.next(); |
| |
| Emp emp = new Emp(id, name); |
| hashTab.add(emp); |
| break; |
| case "list": |
| hashTab.list(); |
| break; |
| case "find": |
| System.out.println("请输入要查找的id"); |
| id = scanner.nextInt(); |
| hashTab.findEmpById(id); |
| break; |
| case "exit": |
| scanner.close(); |
| System.exit(0); |
| default: |
| break; |
| } |
| } |
| } |
| |
| } |
| |
| |
| class HashTab { |
| private EmpLinkedList[] empLinkedListArray; |
| private int size; |
| |
| |
| public HashTab(int size) { |
| this.size = size; |
| |
| empLinkedListArray = new EmpLinkedList[size]; |
| |
| for(int i = 0; i < size; i++) { |
| empLinkedListArray[i] = new EmpLinkedList(); |
| } |
| } |
| |
| |
| public void add(Emp emp) { |
| |
| int empLinkedListNO = hashFun(emp.id); |
| |
| empLinkedListArray[empLinkedListNO].add(emp); |
| |
| } |
| |
| public void list() { |
| for(int i = 0; i < size; i++) { |
| empLinkedListArray[i].list(i); |
| } |
| } |
| |
| |
| public void findEmpById(int id) { |
| |
| int empLinkedListNO = hashFun(id); |
| Emp emp = empLinkedListArray[empLinkedListNO].findEmpById(id); |
| if(emp != null) { |
| System.out.printf("在第%d条链表中找到 雇员 id = %d\n", (empLinkedListNO + 1), id); |
| }else{ |
| System.out.println("在哈希表中,没有找到该雇员~"); |
| } |
| } |
| |
| |
| public int hashFun(int id) { |
| return id % size; |
| } |
| |
| } |
| |
| |
| class Emp { |
| public int id; |
| public String name; |
| public 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; |
| return; |
| } |
| |
| Emp curEmp = head; |
| while(true) { |
| if(curEmp.next == null) { |
| break; |
| } |
| curEmp = curEmp.next; |
| } |
| |
| curEmp.next = emp; |
| } |
| |
| |
| public void list(int no) { |
| if(head == null) { |
| System.out.println("第 "+(no+1)+" 链表为空"); |
| return; |
| } |
| System.out.print("第 "+(no+1)+" 链表的信息为"); |
| Emp curEmp = head; |
| while(true) { |
| System.out.printf(" => id=%d name=%s\t", curEmp.id, curEmp.name); |
| if(curEmp.next == null) { |
| break; |
| } |
| curEmp = curEmp.next; |
| } |
| System.out.println(); |
| } |
| |
| |
| |
| public Emp findEmpById(int id) { |
| |
| if(head == null) { |
| System.out.println("链表为空"); |
| return null; |
| } |
| |
| Emp curEmp = head; |
| while(true) { |
| if(curEmp.id == id) { |
| break; |
| } |
| |
| if(curEmp.next == null) { |
| curEmp = null; |
| break; |
| } |
| curEmp = curEmp.next; |
| } |
| return curEmp; |
| } |
| |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律