产品展示 Dynamic News

java中HashMap学习

发布于2025-02-19 17:38    文章作者:曼卉

甚么是HashMapHashMap鉴于hashing道理,尔们经由过程put()战get()办法贮存战获得对于象。当尔们将键值对于传送给put()办法时,它挪用键对于象的hashCode()办法去计划hashcode,让后找到bucket地位去贮存值对于象。当获得对于象时,经由过程键对于象的equals()办法找到准确的键值对于,而后前往值对于象。HashMap应用链表去处理撞碰题目,当发作撞碰了,对于象将会贮存正在链表的停1个节面中。

publicVput(Kkey,Vvalue){if(key==null)returnputForNullKey(value);inthash=hash(key.hashCode());inti=indexFor(hash,table.length);//bucket地位for(Entry<K,V>e=table[i];e!=null;e=e.next){Objectk;if(e.hash==hash&&((k=e.key)==key||key.equals(k))){VoldValue=e.value;e.value=value;e.recordAccess(this);returnoldValue;//借使该Key仍旧永存,会前往之前保管的值}}modCount++;addEntry(hash,key,value,i);returnnull;}publicVget(Objectkey){if(key==null)returngetForNullKey();inthash=hash(key.hashCode());for(Entry<K,V>e=table[indexFor(hash,table.length)];e!=null;e=e.next){Objectk;if(e.hash==hash&&((k=e.key)==key||key.equals(k)))returne.value;}returnnull;}

当二个对于象的hashcode相反会爆发甚么?它们会贮存正在统一个bucket地位的链表中。键对于象的equals()办法用去找到键值对于。

即使HashMap的年夜小超越了背载果子界说容量,奈何办?默许的背载果子年夜小为0.75,也便是道,当1个map挖谦了75%的bucket时分,战别的集中类(如ArrayList等)一致,将会缔造本去HashMap年夜小的二倍的bucket数组,去从头调剂map的年夜小,并将本去的对于象搁进新的bucket数组中。那个进程喊做rehashing,由于它移用hash办法找到新的bucket地位。

addEntry(hash,key,value,i);voidaddEntry(inthash,Kkey,Vvalue,intbucketIndex){Entry<K,V>e=table[bucketIndex];table[bucketIndex]=newEntry<K,V>(hash,key,value,e);if(size++>=threshold)resize(2*table.length);}voidresize(intnewCapacity){Entry[]oldTable=table;intoldCapacity=oldTable.length;if(oldCapacity==MAXIMUM_CAPACITY){threshold=Integer.MAX_VALUE;return;}Entry[]newTable=newEntry[newCapacity];transfer(newTable);table=newTable;threshold=(int)(newCapacity*loadFactor);}

若是应用的是默许,便曲交new HashMap<String, Object>(),那末正在put第12个元素时,便会停止resize掌握。

staticfinalintDEFAULT_INITIAL_CAPACITY=16;staticfinalfloatDEFAULT_LOAD_FACTOR=0.75f;publicHashMap(){this.loadFactor=DEFAULT_LOAD_FACTOR;threshold=(int)(DEFAULT_INITIAL_CAPACITY*DEFAULT_LOAD_FACTOR);table=newEntry[DEFAULT_INITIAL_CAPACITY];init();}

因此您应当评价本身大概慢存的数目,应用HashMap(int initialCapacity, float loadFactor)机关1个带指定始初容量战添载果子的空 HashMap。

publicHashMap(intinitialCapacity,floatloadFactor){if(initialCapacity<0)thrownewIllegalArgumentException("Illegalinitialcapacity:"+initialCapacity);if(initialCapacity>MAXIMUM_CAPACITY)initialCapacity=MAXIMUM_CAPACITY;if(loadFactor<=0||Float.isNaN(loadFactor))thrownewIllegalArgumentException("Illegalloadfactor:"+loadFactor);//Findapowerof2>=initialCapacityintcapacity=1;while(capacity<initialCapacity)capacity<<=1;this.loadFactor=loadFactor;threshold=(int)(capacity*loadFactor);table=newEntry[capacity];init();}

从头调剂HashMap年夜小生存甚么题目当从头调剂HashMap年夜小的时分,生计条款比赛,由于假设二个线程皆出现HashMap须要从头调剂年夜小了,它们会共时试着调剂年夜小。正在调剂年夜小的进程中,保存正在链表中的元素的顺序会反过去,由于挪动到新的bucket地位的时分,HashMap其实不会将元素搁正在链表的尾部,而是搁正在头部,那是为了不尾部遍历(tail traversing)。借使条款竞赛产生了,那末便逝世轮回了。下面瞅到resize会操纵table,而操纵办法自身战table皆黑白线程平安。

为何String, Interger如许的wrapper类合宜行动键String,Interger如许的wrapper类举动HashMap的键是再得当不外了,并且String最为经常使用。由于String是不行变的,也是final的,并且依然誊写了equals()战hashCode()办法了。其余的wrapper类也有那个特质。不行变性是需要的,由于为了要演算hashCode(),便要预防键值转变,倘若键值正在搁摩登战获得时前往没有共的hashcode的话,那末便没有能从HashMap中找到您念要的对于象。不行变性另有其余的长处如线程平安。假使您能够只是经由过程将某个field证明成final便能保护hashCode是没有变的,那末请这样干吧。由于获得对于象的时分要用到equals()战hashCode()办法,那末键对于象无误的誊写那二个办法黑白常紧张的。若是二个没有相当的对于象前往没有共的hashcode的话,那末撞碰的概率便会小些,如许便能升高HashMap的机能。

尔们能够应用自界说的对于象行动键吗固然您大概应用所有对于象行动键,只需它恪守了equals()战hashCode()办法的界说划定规矩,而且当对于象拔出到Map中以后将没有会再转变了。倘若那个自界说对于象时不行变的,那末它仍然知足了手脚键的条款,由于当它建树以后便仍旧没有能转变了。

推举您浏览更多相关于“ javaHashMaphash键hashCode键值 ”的著作

上海莫尔丽信息科技有限公司