怎么用Java哈希桶方式解决哈希冲突
这篇文章主要介绍了怎么用Java哈希桶方式解决哈希冲突的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Java哈希桶方式解决哈希冲突文章都会有所收获,下面我们一起来看看吧。
一. 实现形式一(键值对只能为整数)我们可以先实现一个比较简单的哈希表,使用java中解决哈希冲突的方法,即哈希桶(开散列)方式实现,其中注意:
可以使用内部类方式定义节点
负载因子默认为0.75
因为我们使用的是哈希桶方式解决哈希冲突,所以在我们扩容成功之后,原来桶中的数据得重新哈希计算出新的位置,不然就和原来桶中的数据的位置不一样了
相关代码如下
publicclassHashBucket{staticclassNode{//使用内部类方式定义节点publicintkey;publicintval;publicNodenext;publicNode(intkey,intval){this.key=key;this.val=val;}}privateNode[]array;publicintusedSize;publicHashBucket(){this.array=newNode[10];this.usedSize=0;}publicvoidput(intkey,intval){//存放数据//1、确定下标intindex=key%this.array.length;//2、遍历这个下标的链表Nodecur=array[index];while(cur!=null){//更新valif(cur.key==key){cur.val=val;return;}cur=cur.next;}//3、cur==null当前数组下标的链表中没有keyNodenode=newNode(key,val);node.next=array[index];array[index]=node;this.usedSize++;//4、判断当前有没有超过负载因子if(loadFactor()>=0.75){//负载因子我们认为0.75//扩容resize();}}publicintget(intkey){//取出数据//以什么方式存储的那就以什么方式取intindex=key%this.array.length;Nodecur=array[index];while(cur!=null){if(cur.key==key){returncur.val;}cur=cur.next;}return-1;}publicdoubleloadFactor(){//计算负载因子returnthis.usedSize*1.0/this.array.length;}publicvoidresize(){//扩容函数//自己创建新的2倍数组Node[]newArray=newNode[2*this.array.length];//遍历原来的哈希桶//最外层循环控制数组下标for(inti=0;i<this.array.length;i++){Nodecur=array[i];NodecurNext=null;while(cur!=null){//记录cur.nextcurNext=cur.next;//在新的数组里面的下标intindex=cur.key%newArray.length;//进行头插法cur.next=newArray[index];newArray[index]=cur;cur=curNext;}}this.array=newArray;}二. 实现方式二(改进版)
上面我们实现的哈希表中的键值对只能存放整型数据,但若是比较复杂的类型,例如字符串,对象等等,此时就需要用到泛型了。其中注意:
同样可以使用内部类方式定义节点类型
使用泛型
将泛型转换成整数时要用到hashCode
方法
利用对象哈希值确定下标,为了防止哈希值太大,应该让其%数组的长度
遍历数组下标时,利用equals方法比较key是否相同
存放自定义的数据类型时,一定要重写hashcode
和equals方法
相关代码如下
classPerson{publicStringid;publicPerson(Stringid){this.id=id;}@OverridepublicStringtoString(){return"Person{"+"id='"+id+'\''+'}';}@Overridepublicbooleanequals(Objecto){if(this==o)returntrue;if(o==null||getClass()!=o.getClass())returnfalse;Personperson=(Person)o;returnObjects.equals(id,person.id);}@OverridepublicinthashCode(){returnObjects.hash(id);}}publicclassHashBuck2<K,V>{staticclassNode<K,V>{publicKkey;publicVval;publicNode<K,V>next;publicNode(Kkey,Vval){this.key=key;this.val=val;}}publicNode<K,V>[]array=(Node<K,V>[])newNode[10];publicintusedSize;publicvoidput(Kkey,Vval){//通过hashcode方法定位数组的下标inthash=key.hashCode();intindex=hash%this.array.length;Node<K,V>cur=array[index];while(cur!=null){//equals起的作用是遍历当前数组下标的key是否相同if(cur.key.equals(key)){cur.val=val;}cur=cur.next;}Node<K,V>node=newNode<>(key,val);node.next=array[index];array[index]=node;this.usedSize++;}publicVget(Kkey){inthash=key.hashCode();intindex=hash%this.array.length;Node<K,V>cur=array[index];while(cur!=null){if(cur.key.equals(key)){returncur.val;}cur=cur.next;}returnnull;}
关于“怎么用Java哈希桶方式解决哈希冲突”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“怎么用Java哈希桶方式解决哈希冲突”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。