哈希表
什么是哈希表?
我的个人总结:所谓哈希表,就是多条链表用数组管理起来,通过散列函数确定在数组中的位置
哈希表是根据关键值码而直接进行访问的数据结构
示意图:
案例讲解
一堆员工,根据id号编入不同的部门,要求不使用数据库,尽量节省内存,速度越快越好(哈希表)
上代码:
package com.DataStructure._09HashTab._fuxi_01;
import org.junit.Test;
import java.util.Scanner;
public class HashTabDemo {
@Test
public void test() {
//创建哈希表
HashTab hashTab = new HashTab(8);
//menu
String key = "";
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("1: 添加雇员");
System.out.println("2: 显示");
System.out.println("3: 查找");
System.out.println("4: 退出");
System.out.print("输入功能:");
key = sc.nextLine();
switch (key) {
case "1":
System.out.print("输入id:");
int id = sc.nextInt();//也会让下面的nextLine()出错的
String error = sc.nextLine();
System.out.print("输入name:");
String name = sc.nextLine();
Emp emp = new Emp(id, name);
hashTab.add(emp);
break;
case "2":
hashTab.showLists();
break;
case "3":
break;
case "4":
System.exit(0);
default:
System.out.println("输入错误!");
break;
}
}
}
}
//哈希表创建
class HashTab {
//链表放到数组里管理
EmpLinkedList[] linkedListsArrays;
private int maxSize;
//构造器
public HashTab(int maxSize) {
this.maxSize = maxSize;
linkedListsArrays = new EmpLinkedList[maxSize];
//重点-->每一个list都要初始化
for (int i = 0; i < maxSize; i++) {
linkedListsArrays[i] = new EmpLinkedList();
}
}
//获取链表在数组中的下标编号
public int getNo(int id) {
//根据结点emp 的id 取模 获取编号
return id % maxSize;
}
//添加
public void add(Emp emp) {
int no = getNo(emp.getId());
linkedListsArrays[no].add(emp);
}
//遍历
public void showLists() {
for (int i = 0; i < maxSize; i++) {
linkedListsArrays[i].showList(i);
}
}
}
//链表
class EmpLinkedList {
private Emp head;//默认是null 这里打算用 无头结点
//添加结点
public void add(Emp emp) {
if (head == null) {//第一个添加的
head = emp;
return;
}
//尾插
Emp temp = head;
while (true) {//找到最后一个节点
if (temp.next == null) {
break;
}
temp = temp.next;
}
temp.next = emp;
}
/**
* 遍历
*
* @param no 链表的编号
*/
public void showList(int no) {
if (head == null) {
System.out.println("第" + (no + 1) + "条链表为空!");
return;
}
System.out.println("第" + (no + 1) + "条链表遍历结果:");
//非空,遍历输出
Emp temp = head;
while (true) {
System.out.println("-->" + temp.toString());
if (temp.next == null) {
break;
}
temp = temp.next;
}
}
}
//员工结点
class Emp {
private int id;
private String name;
public Emp next;
public Emp(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Emp{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
编程总结:
1.首先还是next()和nextLine的问题–>其中nextInt()都是和next() 一样的
2.其次,数组初始化,数组里面的链表也要每个初始化
3.链表有头节点的链表要给头节点自定义一个初始值;而无头结点(head=null)