数据结构与算法-java-哈希表

alicelmx 2020-05-26

什么是哈希表

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。
数据结构与算法-java-哈希表

其实可以这样理解,哈希表就像一个缓冲层

数据结构与算法-java-哈希表

 下面来看一个案例

数据结构与算法-java-哈希表

 大致可以分析如下

数据结构与算法-java-哈希表

package hashTable;

import java.util.Scanner;

//表示一个雇员
class Emp{
    public int id;
    public String name;
    public Emp next;

    public Emp(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

//表示链表
class EmpLinkedList{
    private  Emp head; //默认为null
    //add
    public void add(Emp emp)
    {
        //如果是添加第一个
        if(head ==null)
        {
            head=emp;
            return;
        }
        //不是第一个
        Emp temp = head;
        while (true)
        {
            if(temp.next==null)
            {
                //说明到最后了
                break;
            }
            temp=temp.next; //后移
        }
        //while退出时一定为最后,指向加入链表就行了
        temp.next=emp;
    }
    public void show(){
        if(head==null)
        {
            System.out.println("当前链表为空");
            return;
        }
        System.out.println("当前链表信息为");
        Emp temp=head;
        while (true)
        {
            System.out.printf("=>id=%d name=%s  \t",temp.id,temp.name);
            if (temp.next == null) {

                break;
            }
            temp=temp.next;//后移即++
        }
        System.out.println();//换行
    }

}
//创建hash表,管理多条链表,如图那样
class HashTab{
    private EmpLinkedList [] empLinkedListArray;
    private int size;

    //构造器
    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)
    {
        int empNo=hashFunc(emp.id);
        empLinkedListArray[empNo].add(emp);
    }
    public void show(){
        for (int i=0;i<size;i++)
        {
            empLinkedListArray[i].show();
        }
    }
    public int hashFunc(int id)
    {
        return id%size;  //通过模判断在hash表的位置
    }
}


public class hashTableDemo {
    public static void main(String[] args) {
        HashTab hashTab = new HashTab(7);
        String key="";
        Scanner scanner =new  Scanner(System.in);
        while (true) {
            System.out.println("add:添加雇员");
            System.out.println("show:显示雇员");
            System.out.println("exit:退出");
            key = scanner.next();
            switch (key)
            {
                case "add":
                    System.out.println("输入id");
                    int id = scanner.nextInt();
                    System.out.println("输入名字");
                    String  name = scanner.next();
                    Emp emp = new Emp(id,name);
                    hashTab.add(emp);
                    break;
                case "show":
                    hashTab.show();
                    break;
                case "exit":
                    scanner.close();
                    break;
                default:
                    break;
            }

        }
    }
}

数据结构与算法-java-哈希表

 数据结构与算法-java-哈希表

相关推荐