哈希表
散列表(Hash Table,哈希表)是根据关键码值(key value)而直接进行访问的数据结构。
它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散函数,存放记录的数组叫做散列表。
一般来说,java程序直接访问数据库的速度较慢,这时候会加一个缓存层(缓存产品:redis,memcache)来增加访问速度,除此之外,我们还可以在缓存层自己写出一个哈希表来增加访问速度。
哈希表:
- 数组+链表
- 数组+二叉树
一道题:有一个公司,当有新员工来的时候,要求将该员工信息加入,当输入该员工的id时,要求查找该员工的所有信息。(不使用数据库,速度越快越好==>哈希表)
思路分析:
至少要创建3个类
- Emp雇员类,表示链表中的结点
- EmpLinkedList类,表示链表,链表类需要包含对雇员的操作(add,list,find,del)
- HashTab类,创建一个数组,表示HashTab,数组中包含一个链表;HashTab中仍然需要包含对雇员操作的函数,除此之外,还要包含一个散列函数,通过散列函数来找到对应的链表
代码实现:
package com.dataStructure;
import java.util.Scanner;
public class HashTab {
public static void main(String[] args){
HashTable hashTab = new HashTable();
//菜单
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("name: ");
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" );
int idd = scanner.nextInt();
hashTab.find(idd);
break;
case"exit":
scanner.close();
System.exit(0);
default:
break;
}
}
}
}
class Emp{
int id;
String name;
Emp next;
public Emp(int id,String name){
this.id = id;
this.name = name;
}
}
class EmpLinkedList{
Emp head = null;
public void add(Emp emp){
Emp temp = head;
while(true) {
if (temp == null) {
head = emp;
break;
}
if(temp.next == null){
temp.next = emp;
break;
}
temp = temp.next;
}
}
public void list(){
if(head == null){
System.out.println("list is null!!!");
return;
}
Emp temp = head;
while(true){
System.out.println("第"+temp.id+"个雇员的名字为"+temp.name);
if(temp.next == null){
break;
}
temp = temp.next;
}
}
public void find(int id){
if(head == null){
System.out.println("List is null!cannot find!");
return;
}
Emp temp = head;
while(true){
if(id == temp.id){
System.out.println("第"+temp.id+"个雇员的名字为"+temp.name);
break;
}
if(temp.next == null){
System.out.println("这里没有这个人的信息~");
return;
}
temp = temp.next;
}
}
}
class HashTable{
EmpLinkedList[] EmpLinkedListArr ;
public HashTable(){
EmpLinkedListArr = new EmpLinkedList[7];
//这里必须初始化,否则出现空指针错误
for (int i = 0; i<7 ;i++){
EmpLinkedListArr[i] = new EmpLinkedList();
}
}
public void add(Emp emp){
int id = hash(emp.id);
EmpLinkedListArr[id].add(emp);
}
public void list(){
for(int i = 0;i<EmpLinkedListArr.length;i++){
System.out.println("第"+i+"组:");
EmpLinkedListArr[i].list();
}
}
public void find(int id){
int real_id = hash(id);
EmpLinkedListArr[real_id].find(id);
}
public int hash(int id){
return id%7;
}
}