哈希表
什么是哈希表
首先,哈希表是一种数据结构,它通过某种映射函数(index=f(keyValue))将keyValue映射为某个可以直接访问的位置(索引),从而能加快在该数据结构中查询keyValue的速度。因此一个哈希表通常由数组+链表的结构组合而成,通过数组的索引能快速访问到keyValue存储在哪条链表中,然后再去遍历链表,便可以迅速找到这个keyValue,这样充分利用了数组能快速访问,链表能按需申请内存空间的双重优点,既满足速度的要求也满足内存的要求。
哈希表可以描述为:
哈希表的经典案例分析
需求描述
一个简单的员工管理系统,当有新的雇员来时,在系统中添加这个雇员信息(id,name,age,gender),要求不适用数据库系统,并能根据id快速查询到该雇员信息,且尽可能节省内存开销。
需求分析
不能使用数据库,要求查询速度快,且要节省内存,非哈希表莫属了。
图解
java代码解析
//雇员节点
public class Emp {
public int id;
public String name;
public Emp next;
public Emp(int id,String name){
this.id=id;
this.name=name;
}
}
//雇员链表(不含头节点即head是要存储节点信息的)
public class EmpLinkedList{
private Emp head;
//增减雇员节点
public void add(Emp emp){
if(head==null){
//第一个节点
head=emp;
return;
}
//不是第一个节点,需要遍历到链表的最后,然后将emp添加进去
Emp tmp=head;
while(tmp.next!=null){
tmp=tmp.next;
}
tmp.next=tmp;
}
//根据id查找emp的信息
public Emp findEmpById(int id){
if(head==null){
System.out.println("当前链表为空无法查询!!");
}
Emp tmp=head;
while(tmp.next!=null){
if(tmp.id==id){
//找到了
return tmp;
}
tmp=tmp.next;
}
return null;
}
}
/**
* HashTable=数组+链表
* */
public class HashTable{
private EmpLinkedList[] empLinkedListArray;//存放链表的数组
private int size;//链表的条数
public HashTable(int size){
//必须要初始化数组中的每一条链表
//所谓初始化new,就是在堆内存中开辟内存空间,并返回一个指向这个内存空间的引用。
for(int i=0;i<size;i++){
empLinkedListArray[i]=new EmpLinkedList()
}
}
/**
* 为该链表定义一个映射规则,关键字为:id
*
* */
private int hashFun(int id){
return id%size;
}
//将雇员添加到哈希表中
public void add(Emp emp){
int EmpId=hashFun(emp.id);//找到哪条链表存储这条信息
//向对应的链表添加雇员
empLinkedListArray[EmpId].add(emp);
}
//根据Id查找相应的雇员信息
public Emp findById(int id){
int EmpLinkedListNo=hashFun(id);
EmpLinkedList curEmpLinkedList=empLinkedListArray[EmpLinkedListNo];
Emp emp=curEmpLinkedList.findEmpById(id);
if(emp==null{
System.out.println("雇员不存在");
}
}
}