怎么用Java哈希桶方式解决哈希冲突
发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍了怎么用Java哈希桶方式解决哈希冲突的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Java哈希桶方式解决哈希冲突文章都会有所收获,下面我们一起来看
千家信息网最后更新 2026年11月02日怎么用Java哈希桶方式解决哈希冲突
这篇文章主要介绍了怎么用Java哈希桶方式解决哈希冲突的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Java哈希桶方式解决哈希冲突文章都会有所收获,下面我们一起来看看吧。
一. 实现形式一(键值对只能为整数)
我们可以先实现一个比较简单的哈希表,使用java中解决哈希冲突的方法,即哈希桶(开散列)方式实现,其中注意:
可以使用内部类方式定义节点
负载因子默认为0.75
因为我们使用的是哈希桶方式解决哈希冲突,所以在我们扩容成功之后,原来桶中的数据得重新哈希计算出新的位置,不然就和原来桶中的数据的位置不一样了
相关代码如下
public class HashBucket { static class Node {//使用内部类方式定义节点 public int key; public int val; public Node next; public Node(int key, int val) { this.key = key; this.val = val; } } private Node[] array; public int usedSize; public HashBucket() { this.array = new Node[10]; this.usedSize = 0; } public void put(int key,int val) {//存放数据 //1、确定下标 int index = key % this.array.length; //2、遍历这个下标的链表 Node cur = array[index]; while (cur != null) { //更新val if(cur.key == key) { cur.val = val; return; } cur = cur.next; } //3、cur == null 当前数组下标的链表中没有key Node node = new Node(key,val); node.next = array[index]; array[index] = node; this.usedSize++; //4、判断当前有没有超过负载因子 if(loadFactor() >= 0.75) {//负载因子我们认为0.75 //扩容 resize(); } } public int get(int key) {//取出数据 //以什么方式存储的 那就以什么方式取 int index = key % this.array.length; Node cur = array[index]; while (cur != null) { if(cur.key == key) { return cur.val; } cur = cur.next; } return -1; } public double loadFactor() {//计算负载因子 return this.usedSize*1.0 / this.array.length; } public void resize() {//扩容函数 //自己创建新的2倍数组 Node[] newArray = new Node[2*this.array.length]; //遍历原来的哈希桶 //最外层循环 控制数组下标 for (int i = 0; i < this.array.length; i++) { Node cur = array[i]; Node curNext = null; while (cur != null) { //记录cur.next curNext = cur.next; //在新的数组里面的下标 int index = cur.key % newArray.length; //进行头插法 cur.next = newArray[index]; newArray[index] = cur; cur = curNext; } } this.array = newArray; }二. 实现方式二(改进版)
上面我们实现的哈希表中的键值对只能存放整型数据,但若是比较复杂的类型,例如字符串,对象等等,此时就需要用到泛型了。其中注意:
同样可以使用内部类方式定义节点类型
使用泛型
将泛型转换成整数时要用到
hashCode方法利用对象哈希值确定下标,为了防止哈希值太大,应该让其%数组的长度
遍历数组下标时,利用equals方法比较key是否相同
存放自定义的数据类型时,一定要重写
hashcode和equals方法
相关代码如下
class Person { public String id; public Person(String id) { this.id = id; } @Override public String toString() { return "Person{" + "id='" + id + '\'' + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return Objects.equals(id, person.id); } @Override public int hashCode() { return Objects.hash(id); }}public class HashBuck2 { static class Node { public K key; public V val; public Node next; public Node(K key,V val) { this.key = key; this.val = val; } } public Node[] array = (Node[]) new Node[10]; public int usedSize; public void put(K key,V val) { //通过hashcode方法定位数组的下标 int hash = key.hashCode(); int index = hash % this.array.length; Node cur = array[index]; while (cur != null) { //equals 起的作用是遍历当前数组下标的key是否相同 if(cur.key.equals(key)) { cur.val = val; } cur = cur.next; } Node node = new Node<>(key,val); node.next = array[index]; array[index] = node; this.usedSize++; } public V get(K key) { int hash = key.hashCode(); int index = hash % this.array.length; Node cur= array[index]; while (cur != null) { if(cur.key.equals(key)) { return cur.val; } cur = cur.next; } return null; } 关于"怎么用Java哈希桶方式解决哈希冲突"这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对"怎么用Java哈希桶方式解决哈希冲突"知识都有一定的了解,大家如果还想学习更多知识,欢迎关注行业资讯频道。
哈希
方式
下标
数组
冲突
数据
方法
因子
知识
类型
节点
相同
代码
位置
内容
对象
整数
篇文章
复杂
成功
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
广东万易互联网科技有限公司惠州分公司
山东特亿宝互联网科技有限公司
互联网科技深圳
互联网品科技
平安科技 互联网
期待互联网科技
华中科技大学互联网
美国互联网黑科技
电子科技大学互联网
金融科技和互联网金融
互联网 科技馆
福州新华互联网科技学校 知乎
互联网媒体平台算高科技产业
深圳市优智互联网科技有限公司
互联网金融科技名词解释
黑云互联网科技有限公司
21世纪互联网科技成就
广西科技产业互联网是什么
唐山双旺合互联网科技产业园
前海云享互联网科技
广东猪兼强互联网科技有限公司
盈实互联网科技
科技与互联网发展
狮子座互联网科技
世界互联网领先科技成果
互联网科技有限公司 翻译
隆华科技工业互联网
互联网科技实习生岗位职责
广州千川互联网科技有限公司
唐山双旺合互联网科技产业园