首先,哈希表是一种数据结构,它经过某种映射函数\(index=f(keyValue)\)将keyValue映射为某个能够直接访问的位置(索引),从而能加快在该数据结构中查询keyValue的速度。所以一个哈希表一般由数组+链表的结构组合而成,经过数组的索引能快速访问到keyValue存储在哪条链表中,而后再去遍历链表,即可以迅速找到这个keyValue,这样充分利用了数组能快速访问,链表能按需申请内存空间的双重优势,既知足速度的要求也知足内存的要求。
哈希表能够描述为:
java
需求描述
一个简单的员工管理系统,当有新的雇员来时,在系统中添加这个雇员信息(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("雇员不存在"); } } }