06_哈希表

 


 1.哈希表的概念


 

 2.散列函数的概念


 

 3.哈希表的内存图


 

 4.哈希表的Java实现(数组+链表)

复制代码
package DataStructureReview;

import java.util.ArrayList;
import java.util.LinkedList;

public class HashTableDemo {
    public static void main(String[] args) {
        //创建hashtable
        HashTable hashTable = new HashTable();
        //添加数据
        hashTable.add(new Emp(1, "x"));
        hashTable.add(new Emp(2, "y"));
        hashTable.add(new Emp(3, "z"));
        hashTable.add(new Emp(4, "a"));
        //遍历
        System.out.println(hashTable.toString());
        //根据id查询元素
        System.out.println(hashTable.findEmpById(2));
        //根据id删除元素
        System.out.println(hashTable.delete(2));
        System.out.println(hashTable);


    }
}

class HashTable {
    private ArrayList<LinkedList> linkedlistarr = new ArrayList();
    //设置哈希表链表条数
    private int size = 10;

    //为链表数组初始化
    public HashTable() {
        for (int i = 0; i < size; i++) {
            linkedlistarr.add(i, new LinkedList<Emp>());
        }
    }

    //添加数据
    public void add(Emp emp) {
        //根据散列函数确定数据存放在第几条链表上
        linkedlistarr.get(hashFun(emp.id)).add(emp);
    }

    //删除数据,根据员工id删除
    public boolean delete(int id) {
        //获取数据存放的链表
        LinkedList linkedList = linkedlistarr.get(hashFun(id));
        //判断编号为id的员工是否存在
        boolean flag = false;
        Emp emp = null;
        for (Object obj : linkedList) {
            emp = (Emp) obj;
            if (emp.id == id) {
                flag = true;
                break;
            }
        }
        //删除元素
        if (flag == true) {
            linkedList.remove(emp);
        }
        return flag;
    }

    //根据id查询数据记录
    public Emp findEmpById(int id) {
        //获取数据存放的链表
        LinkedList linkedList = linkedlistarr.get(hashFun(id));
        //判断编号为id的员工是否存在
        boolean flag = false;
        Emp emp = null;
        for (Object obj : linkedList) {
            emp = (Emp) obj;
            if (emp.id == id) {
                flag = true;
                break;
            }
        }
        return flag ? emp : null;
    }

    //遍历hashtable
    @Override
    public String toString() {
        for (int i = 0; i < size; i++) {

            if (linkedlistarr.get(i).isEmpty() != true) {
                for (Object obj : linkedlistarr.get(i)) {
                    System.out.println((Emp) obj);
                }
            }

        }

        return "";
    }

    //散列函数(哈希函数),给定key value 返回存储在那条链表上
    public int hashFun(int id) {
        //除留余数法
        return id % size;
    }


}

class Emp {
    public int id;
    private String name;

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

    @Override
    public String toString() {
        return "Emp{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
复制代码
posted @   学而不思则罔!  阅读(138)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· SpringCloud带你走进微服务的世界
点击右上角即可分享
微信分享提示