10 哈希表(Hashtable)
引入:
有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址…),当输入该员工的id时,要求查找到该员工的所有信息。
要求:不适用数据结构,尽量节省内存,速度越快越好=>哈希表(散列)
1)基础介绍
哈希表(又叫散列表),是根据关键码值(key value)而直接进行访问的数据结构。
也就是说,它通过关键码直接映射到表中的位置来访问,以加快查找速度
这个映射函数叫做散列函数,存放记录的数组叫散列表
2)哈希表实际应用场景
一个java程序会经常的调动数据库里的数据,为了加快这个调用,程序员在java程序和数据库之间加入一个缓存层,以缓存要调用的数据,依次加快调用速度。
缓存层可以是现有的缓存产品,比如:Redis、Memcache;也可以是自己写出,比如:哈希表。
3)哈希表的结构
1. 有两种形式:
- 数组+链表
- 数组+二叉树
2.哈希表的内存结构
如图是数组(左)+链表(右)的形式
4)哈希表实现思路图解
google公司的一个上机题
有一个公司,当有新的员工来报道时,要求将该员工的信息加入(id,性别,年龄,住址…),当输入该员工的id时,要求查找到该员工的所有信息。
要求:不适用数据结构,尽量节省内存,速度越快越好=>哈希表(散列)
添加时,保证id从低到高插入
做题流程:
- 使用链表来实现哈希表,该链表不带头(即:链表的第一个节点就存放雇员信息)
- 思路分析并画示意图
- 代码实现 ↓
5)代码实现——增删改查
package DataStructures.Hashtable;
import java.util.Scanner;
public class HashTableDemo {
public static void main(String[] args) {
//创建哈希表
HashTable hashTable = new HashTable(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("exit:退出系统");
System.out.println("del:删除雇员");
key = scanner.next();
switch (key){
case "add":
System.out.println("输入id");
int id = scanner.nextInt();
System.out.println("输入名字"