您好,登錄后才能下訂單哦!
這篇文章主要介紹“什么是哈希表”,在日常操作中,相信很多人在什么是哈希表問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”什么是哈希表”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
散列表(Hash Table,也叫哈希表),是根據關鍵碼值(Key Value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中的一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表
有一個公司,當有新員工來報到時,要求將該員工的信息加入(id,性別,年齡,地址….),當輸入該員工的id時,要求查找該員工的所有信息。
要求:不使用數據庫,盡量節省內存,速度越快越好。
package com.xie.hashtable; import java.util.Scanner; public class HashTableDemo { public static void main(String[] args) { //創建一個HashTab HashTab hashTab = new HashTab(7); 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("delete:刪除雇員"); 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("請輸入編號"); int no = scanner.nextInt(); hashTab.findEmpById(no); break; case "delete": System.out.println("請輸入編號"); int deleteNo = scanner.nextInt(); hashTab.deleteEmpById(deleteNo); break; case "exit": scanner.close(); System.exit(0); break; default: break; } } } } //創建哈希表,管理多條鏈表 class HashTab { private int size; private EmpLinkedList[] empLinkedListArray; public HashTab(int size) { this.size = size; empLinkedListArray = new EmpLinkedList[size]; for (int i = 0; i < size; i++) { empLinkedListArray[i] = new EmpLinkedList(); } } //添加雇員 public void add(Emp emp) { //根據員工的id,得到該員工應當添加到哪條鏈表 int empLinkedListNo = hashFun(emp.id); //將emp添加到對應的鏈表 empLinkedListArray[empLinkedListNo].add(emp); } //查找員工 public Emp findEmpById(int id) { int no = hashFun(id); Emp empById = empLinkedListArray[no].findEmpById(id); if (empById == null) { System.out.println("不存在id=" + id + "元素"); return null; } else { System.out.println("存在id=" + id + ",name=" + empById.name); return empById; } } //刪除雇員 public void deleteEmpById(int id) { int no = hashFun(id); empLinkedListArray[no].deleteEmp(id); } //遍歷哈希表 public void list() { for (int i = 0; i < size; i++) { empLinkedListArray[i].list(i); } } //編寫散列函數,使用簡單的取模法 private int hashFun(int id) { return id % size; } } //表示雇員 class Emp { public int id; public String name; public Emp next; public Emp(int id, String name) { this.id = id; this.name = name; } @Override public String toString() { return "Emp{" + "id=" + id + ", name='" + name + '\'' + '}'; } } //表示鏈表 class EmpLinkedList { //頭指針 private Emp head; //添加雇員到鏈表 //說明: //1.當添加雇員時,id時自增的,即id分配總是從小到大,因此我們將該雇員直接加到本鏈表的最后即可 public void add(Emp emp) { //如果是添加第一個雇員 if (head == null) { head = emp; } else { Emp curr = head; while (true) { if (curr.next == null) { break; } curr = curr.next; } curr.next = emp; } } //遍歷 public void list(int no) { if (head == null) { System.out.println("第" + (no + 1) + "鏈表為空"); return; } System.out.print("第" + (no + 1) + "鏈表信息為:"); Emp curr = head; while (true) { if (curr != null) { System.out.printf("=> id=%d,name=%s\t", curr.id, curr.name); curr = curr.next; } else { break; } } System.out.println(); } //根據id查找雇員 public Emp findEmpById(int id) { if (head == null) { System.out.println("鏈表為空"); return null; } Emp temp = head; while (temp != null) { if (temp.id == id) { return temp; } temp = temp.next; } return null; } //根據id刪除雇員 public void deleteEmp(int id) { if (head == null) { System.out.println("沒有id=" + id + "的雇員"); return; } Emp curr = head; boolean flag = false; while (true) { if (curr == null) { break; } if (curr.next.id == id) { flag = true; break; } curr = curr.next; } if (flag) { curr.next = curr.next.next; } else { System.out.println("沒有id=" + id + "的雇員"); } } }
到此,關于“什么是哈希表”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。