JAVA数据结构---哈希表
什么是哈希表
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通 过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组 叫做散列表。
java程序访问数据的方式
下面的代码采用数组+链表的结构
代码实现
package bilibili.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("请输入指令: ");
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(name, id);
hashTab.addEmp(emp);
break;
case "list":
hashTab.ListEmp();
break;
case "find":
System.out.println("请输入要查找的Id: ");
int ID = scanner.nextInt();
hashTab.Findemp(ID);
break;
case "exit":
scanner.close();
System.exit(0);
}
}
}
}
class HashTab {
private EmpLinkedList[] empLinkedLists;
private int size;
//size表示链表的个数
public HashTab(int size) {
this.size = size;
empLinkedLists = new EmpLinkedList[size];
//初始化每一个链表
for (int i = 0; i < size; i++) {
empLinkedLists[i] = new EmpLinkedList();
}
}
//添加成员
public void addEmp(Emp emp) {
int no = HashFun(emp.Id);
empLinkedLists[no].add(emp);
}
//展示成员
public void ListEmp() {
for (int i = 0; i < size; i++) {
empLinkedLists[i].List(i);
}
}
//查找成员
public void Findemp(int Id) {
int no = HashFun(Id);
Emp emp = empLinkedLists[no].findEmp(Id);
if (emp == null) {
System.out.println("没有找到");
} else {
System.out.println("ID= " + emp.Id + " 姓名为: " + emp.name);
}
}
//哈希函数
public int HashFun(int n) {
return n % size;
}
}
class Emp {
public String name;
public int Id;
public Emp next;
public Emp(String name, int id) {
this.name = name;
this.Id = id;
}
}
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) {
curEmp.next = emp;
break;
}
curEmp = curEmp.next;
}
}
//遍历链表的雇员信息
public void List(int no) {
if (head == null) {
System.out.println("第" + (no + 1) + "条链表为空");
return;
}
Emp curEmp = head;
while (true) {
System.out.println("姓名为: " + curEmp.name + " ID为:" + curEmp.Id);
if (curEmp.next == null) {
break;
}
curEmp = curEmp.next;
}
}
//查找雇员信息
public Emp findEmp(int Id) {
if (head == null) {
return null;
}
Emp curEmp = head;
while (true) {
if (curEmp.Id == Id) {
return curEmp;
}
if (curEmp.next == null) {
return null;
}
curEmp = curEmp.next;
}
}
}