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