哈希表 详细讲解
1、哈希表的基本介绍
散列表(Hash table,也叫哈希表)是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列数存放记录的数组叫做散列表
2、哈希表(散列-Google)上机题
1)看一个实际需求,google公司的一个上机题:
2)有一个公司,当有新的员工来报道时,要求将该员工的信息加入d,性别,年龄,住址),当输入该员工的id时,要求查找到该员工的所有信息
3)要求:不使用数据库,尽量节省内存,速度越快越好=>哈希表(散列)
3、哈希表(散列-Google)上机题思路分析
4、代码实现
package com.qf.hash;import java.util.Scanner;public class HashTabDemo { public static void main(String[] args) { HashTab hashTab=new HashTab(8); boolean loop=true; String sc=""; while (loop){ System.out.println("add 添加员工"); System.out.println("list 展示员工"); System.out.println("find 查找员工"); System.out.println("exit 退出"); Scanner systemPut=new Scanner(System.in); sc=systemPut.next(); switch (sc){ case "add": System.out.println("请输入员工编号:"); Scanner addNum=new Scanner(System.in); int id = addNum.nextInt(); System.out.println("请输入员工名字:"); Scanner nameScan=new Scanner(System.in); String name = nameScan.next(); Emp emp=new Emp(id,name); hashTab.add(emp); break; case "list": hashTab.list(); break; case "find": System.out.println("请输入员工编号:"); Scanner find=new Scanner(System.in); int findId = find.nextInt(); hashTab.find(findId); break; case "exit": loop=false; System.out.println("退出循环"); break; default : break; } } }}class HashTab{ public EmpLinkedList[] linkedListArray; public int maxSize; public HashTab(int maxSize){ this.maxSize=maxSize; linkedListArray=new EmpLinkedList[maxSize]; for (int i = 0; i < linkedListArray.length; i++) { linkedListArray[i]=new EmpLinkedList(); } } public void add(Emp emp){ int id=emp.id; int location=id%maxSize; EmpLinkedList linkedList=linkedListArray[location]; linkedList.add(emp); } public void list(){ for (int i = 0; i < linkedListArray.length; i++) { linkedListArray[i].list(i); } } public void find(int id){ int location=id%maxSize; EmpLinkedList linkedList=linkedListArray[location]; linkedList.find(id); }}class EmpLinkedList{ public Emp head; public EmpLinkedList(){} public void add(Emp emp){ if (head==null){ head=emp; }else{ Emp temp=head; while (true){ if (temp.next==null){ break; } temp=temp.next; } temp.next=emp; } } public void list(int i){ if (head==null){ System.out.println("第"+i+"条链表的长度为空"); }else { Emp temp=head; while (true){ System.out.println("第"+i+"条链表员工id为:"+temp.id+"名字为:"+temp.name); if (temp.next==null){ break; } temp=temp.next; } } } public void find(int id){ if (head==null){ System.out.println("链表长度为空,未能找到员工"); }else{ Emp temp=head; boolean isFind=false; while (true){ if (temp.id==id){ isFind=true; System.out.println("员工的名字为:"+temp.name); break; } if (temp.next==null){ break; } temp=temp.next; } if (!isFind){ System.out.println("未能找到员工"); } } }}class Emp{ public int id; public String name; public Emp next; public Emp(int id, String name) { this.id = id; this.name = name; } @Override public String toString() { return "Emp{" + "id=" + id + ", name='" + name + '\'' + '}'; }}