Java怎么实现哈希表的基本功能
本篇内容主要讲解“Java怎么实现哈希表的基本功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java怎么实现哈希表的基本功能”吧!
一、哈希表头插法放入元素/***user:ypc;*date:2021-05-20;*time:11:05;*/publicclassHashBuck{classNode{publicintkey;intvalue;Nodenext;Node(intkey,intvalue){this.key=key;this.value=value;}}publicintusedSize;publicNode[]array;HashBuck(){this.array=newNode[8];this.usedSize=0;}//JDk1.7及之前是头插法publicvoidput1(intkey,intvalue){intindex=key%this.array.length;Nodenode=newNode(key,value);Nodecur=array[index];while(cur!=null){if(cur.key==key){cur.value=value;return;}cur=cur.next;}node.next=array[index];array[index]=node;this.usedSize++;if(loadFactor()>0.75){resize1();}}publicdoubleloadFactor(){returnthis.usedSize/this.array.length*1.0;}}二、哈希表尾插法放入元素
//JDK1.8是尾插法publicNodefindLast(Nodehead){if(head==null)returnhead;Nodecur=head;while(cur.next!=null){cur=cur.next;}returncur;}publicvoidput2(intkey,intvalue){intindex=key%this.array.length;Nodenode=newNode(key,value);Nodecur=array[index];while(cur!=null){if(cur.key==key){cur.value=value;return;}cur=cur.next;}Nodelast=findLast(array[index]);if(last==null){array[index]=node;this.usedSize++;return;}last.next=node;this.usedSize++;if(loadFactor()>0.75){resize2();}}三、哈希表头插、尾插扩容
publicvoidresize1(){Node[]newArray=newNode[this.array.length*2];for(inti=0;i<this.array.length;i++){Nodecur=array[i];while(cur!=null){intindex=cur.key%newArray.length;NodecurNext=cur.next;cur.next=newArray[index];newArray[index]=cur;cur=curNext;}}this.array=newArray;}//resize尾插publicvoidresize2(){Node[]newArray=newNode[this.array.length*2];for(inti=0;i<this.array.length;i++){Nodecur=array[i];while(cur!=null){intindex=cur.key%newArray.length;NodecurNext=cur.next;Nodelast=findLast(newArray[index]);if(last==null){newArray[index]=cur;break;}last.next=cur;cur=curNext;}}this.array=newArray;}publicNodefindLast(Nodehead){if(head==null)returnhead;Nodecur=head;while(cur.next!=null){cur=cur.next;}returncur;}四、找到key对应的value
publicintget(intkey){intindex=key%this.array.length;Nodecur=this.array[index];while(cur!=null){if(cur.key==key){returncur.value;}cur=cur.next;}return-1;}五、运行结果
classHashBuckTest{publicstaticvoidmain(String[]args){HashBuckhashBuck=newHashBuck();//头插hashBuck.put1(9,451);hashBuck.put1(17,455);//尾插//hashBuck.put2(9,451);//hashBuck.put2(17,455);hashBuck.put1(2,45);hashBuck.put1(3,14);hashBuck.put1(4,52);hashBuck.put1(4,89);System.out.println(hashBuck.get(1));System.out.println("+=================");}}
扩容
classHashBuckTest{publicstaticvoidmain(String[]args){HashBuckhashBuck=newHashBuck();//hashBuck.put1(9,451);//hashBuck.put1(17,455);hashBuck.put1(1,589);hashBuck.put1(2,45);hashBuck.put1(3,14);hashBuck.put1(4,52);hashBuck.put1(4,1);hashBuck.put1(6,829);hashBuck.put1(7,72);hashBuck.put1(8,8279);hashBuck.put2(9,451);hashBuck.put2(15,455);hashBuck.put2(31,451);System.out.println(hashBuck.get(7));System.out.println(hashBuck.get(4));System.out.println(hashBuck.get(15));System.out.println(hashBuck.get(31));}}六、哈希表的泛型实现
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;publicintusedSize;publicHashBuck2(){this.array=(Node<K,V>[])newNode[8];}publicvoidput(Kkey,Vval){inthash=key.hashCode();intindex=hash%array.length;Node<K,V>cur=array[index];while(cur!=null){if(cur.key.equals(key)){cur.val=val;return;}cur=cur.next;}Node<K,V>node=newNode<>(key,val);node.next=array[index];array[index]=node;this.usedSize++;if(loadFactor()>0.75){resize();}}publicVget(Kkey){inthash=key.hashCode();intindex=hash%array.length;Node<K,V>cur=array[index];while(cur!=null){if(cur.key.equals(key)){returncur.val;}cur=cur.next;}returnnull;}publicvoidresize(){Node[]newArray=newNode[this.array.length*2];for(inti=0;i<this.array.length;i++){Node<K,V>cur=array[i];while(cur!=null){inthash=cur.key.hashCode();intindex=hash%array.length;Node<K,V>curNext=cur.next;cur.next=newArray[index];newArray[index]=cur;cur=curNext;}}this.array=newArray;}publicdoubleloadFactor(){returnthis.usedSize/this.array.length*1.0;}}
/***user:ypc;*date:2021-05-20;*time:15:25;*/classStudent{publicintid;Student(intid){this.id=id;}@Overridepublicbooleanequals(Objecto){if(this==o)returntrue;if(o==null||getClass()!=o.getClass())returnfalse;Studentstudent=(Student)o;returnid==student.id;}@OverridepublicinthashCode(){returnObjects.hash(id);}}classHashBuck2Test{publicstaticvoidmain(String[]args){HashBuck2<Student,Integer>hashBuck2=newHashBuck2<>();Students1=newStudent(10001);Students2=newStudent(10001);Students3=newStudent(10003);hashBuck2.put(s1,89);hashBuck2.put(s1,60);hashBuck2.put(s2,94);hashBuck2.put(s3,100);System.out.println(hashBuck2.get(s1));System.out.println(hashBuck2.get(s2));}}
注意:
要用自定义类作为 HashMap 的 key 或者 HashSet 的值,必须覆写 hashCode 和 equals 方 法,而且要做到 equals 相等的对象,hashCode 一定是一致的。
比如Student s1 和 s2 的id一样,得到的却是不同的value,所以要覆写hashCode 和 equals 方 法,如果不覆写,则使用的是Object类的hashCode 和 equals 方 法,比较的是地址。
hashmap用数组+链表。数组是固定长度,链表太长就需要扩充数组长度进行rehash减少链表长度。如果两个线程同时触发扩容,在移动节点时会导致一个链表中的2个节点相互引用,从而生成环链表
到此,相信大家对“Java怎么实现哈希表的基本功能”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。