首先,哈希表是一種數據結構,它經過某種映射函數\(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("僱員不存在"); } } }