摘要:學(xué)習(xí)手動(dòng)寫一個(gè)簡(jiǎn)單的進(jìn)行理解結(jié)點(diǎn)的定義的基礎(chǔ)時(shí)一個(gè)數(shù)組,數(shù)組里每個(gè)元素是一個(gè),他必須包括值,鍵值,,下一個(gè)結(jié)點(diǎn),同一個(gè)值的結(jié)點(diǎn)用一條鏈栓起來(lái)。第一個(gè)結(jié)點(diǎn)的特殊操作第一個(gè)對(duì)上了修改一個(gè)元素查找一個(gè)元素
HashMap學(xué)習(xí)--手動(dòng)寫一個(gè)簡(jiǎn)單的HashMap進(jìn)行理解 1.結(jié)點(diǎn)Node的定義
public class Node { public int hash; public Object key; public Object value; public Node next; }
HashMap的基礎(chǔ)時(shí)一個(gè)數(shù)組,數(shù)組里每個(gè)元素是一個(gè)node,他必須包括:hash值,key鍵值,value,next下一個(gè)結(jié)點(diǎn),同一個(gè)hash值的結(jié)點(diǎn)用一條鏈栓起來(lái)。
2.HashMap的定義Node[] table;//核心數(shù)組 int size;//元素個(gè)數(shù) public HashmapTest(){ table=new Node[16];//初始化數(shù)組大小,盡量2的整數(shù)冪 size=0; }
這個(gè)數(shù)組大小有講究,從兩個(gè)極端理解,當(dāng)大小為1時(shí),也就是所有的元素栓在一個(gè)位子上,也就是退化成了鏈表。如果數(shù)組很大,也就是元素所有元素幾乎可以散在數(shù)組的每個(gè)位子上,也就是退化成了數(shù)組。至于取2的整數(shù)冪,可以將取余的操作使用按位&,加快速度,除法在計(jì)算機(jī)中的速度是很慢的。
3.HashMap的增刪改查 增加一個(gè)元素public void put(K key,V value){ Node newNode=new Node(); Node lastNode=null; Boolean isRepeat=false; newNode.hash=myhash(key.hashCode(),table.length);//簡(jiǎn)單的計(jì)算hash值的函數(shù),就是對(duì)數(shù)組大小進(jìn)行取余,不考慮擴(kuò)容以及優(yōu)化 newNode.key=key; newNode.value=value; newNode.next=null; if(table[newNode.hash]==null){ table[newNode.hash]=newNode; }else{ Node tmp=table[newNode.hash]; while (tmp!=null){ if(tmp.key.equals(key)){ isRepeat=true; tmp.value=value; break; }else{ lastNode=tmp; tmp=tmp.next; } } if(isRepeat==false){ lastNode.next=newNode; } } }刪除對(duì)應(yīng)key值的元素
public void delete(K key){ int hash=myhash(key.hashCode(),table.length); Node temp=table[hash]; Node prevNode=null;//記住前一個(gè)結(jié)點(diǎn),刪除時(shí)要接上。 while(temp!=null){ //第一個(gè)結(jié)點(diǎn)的特殊操作 if(temp.key.equals(table[hash].key)){ //第一個(gè)對(duì)上了 if(temp.key.equals(key)){ table[hash]=temp.next; break; }else{ prevNode=temp; temp=temp.next; } }else{ if(temp.key.equals(key)){ prevNode.next=temp.next; break; }else{ temp=temp.next; } } } }修改一個(gè)元素
public void set(K key,V value){ Node temp=table[myhash(key.hashCode(),table.length)]; while (temp!=null){ if(temp.key.equals(key)){ temp.value=value; break; }else { temp=temp.next; } } }查找一個(gè)元素
public V get(K key){ int hash=myhash(key.hashCode(),table.length); Node tmp=table[hash]; if(tmp==null){ return null; }else{ while (tmp!=null){ if(tmp.key.equals(key)){ return (V)tmp.value; }else { tmp=tmp.next; } } return null; } }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74560.html
摘要:原文地址游客前言金三銀四,很多同學(xué)心里大概都準(zhǔn)備著年后找工作或者跳槽。最近有很多同學(xué)都在交流群里求大廠面試題。 最近整理了一波面試題,包括安卓JAVA方面的,目前大廠還是以安卓源碼,算法,以及數(shù)據(jù)結(jié)構(gòu)為主,有一些中小型公司也會(huì)問(wèn)到混合開發(fā)的知識(shí),至于我為什么傾向于混合開發(fā),我的一句話就是走上編程之路,將來(lái)你要學(xué)不僅僅是這些,豐富自己方能與世接軌,做好全棧的裝備。 原文地址:游客kutd...
摘要:那既然頻繁出,肯定不能是手撕紅黑樹我覺得面試官也多半撕不出來(lái),不撕紅黑樹,那這道題還有點(diǎn)救,慢慢往下看。簡(jiǎn)單說(shuō)來(lái)說(shuō),哈希表由兩個(gè)要素構(gòu)成桶數(shù)組和散列函數(shù)。所謂的哈希沖突,就是不同的經(jīng)過(guò)哈希函數(shù)計(jì)算,落到了同一個(gè)下標(biāo)。快手面試官真的嗎我不信。手寫HashMap?這么狠,面試都卷到這種程度了?第一次見到這個(gè)面試題,是在某個(gè)不方便透露姓名的Offer收割機(jī)大佬的文章:這……我當(dāng)時(shí)就麻了,我們都知道...
摘要:把內(nèi)存分成兩種,一種叫做棧內(nèi)存,一種叫做堆內(nèi)存在函數(shù)中定義的一些基本類型的變量和對(duì)象的引用變量都是在函數(shù)的棧內(nèi)存中分配。堆內(nèi)存用于存放由創(chuàng)建的對(duì)象和數(shù)組。 一次慘痛的阿里技術(shù)面 就在昨天,有幸接到了阿里的面試通知,本來(lái)我以為自己的簡(jiǎn)歷應(yīng)該不會(huì)的到面試的機(jī)會(huì)了,然而機(jī)會(huì)卻這么來(lái)了,我卻沒(méi)有做好準(zhǔn)備,被面試官大大一通血虐。因此,我想寫點(diǎn)東西紀(jì)念一下這次的經(jīng)歷,也當(dāng)一次教訓(xùn)了。其實(shí)面試官大大...
閱讀 2327·2021-11-23 09:51
閱讀 3760·2021-11-11 10:57
閱讀 1407·2021-10-09 09:43
閱讀 2496·2021-09-29 09:35
閱讀 2026·2019-08-30 15:54
閱讀 1796·2019-08-30 15:44
閱讀 3191·2019-08-30 13:20
閱讀 1700·2019-08-30 11:19