破碎的殘陽,我們逆光【連載小說】- HashMap剖析
“行到水窮處,坐看雲起時”
前言:
偶爾翻閱了自己當時高中時代寫的日誌,發現了幾篇自己多年未開啟的自寫小說草本,小說的名字叫做《破碎的殘陽,我們逆光》,可能這是那個懵懂的年紀排解學習壓力的一種方式吧,當年有心想把它繼續寫下去,一直完結,奈何高中時代時間緊張,加上有些表達上的畏手畏腳,不敢過多展露偏情感的一些東西,總是擔心被同學讀者發現了自己懷揣著的夢想以及不能說的祕密,如今看來,如果一篇文章不能傾其感情,即使寫出來也是枯燥無味的,倒不如大膽表達。我知道程式設計師的我們在寫部落格時很為難,如果一篇文章總是長篇大論的技術堆砌,讀者讀起來也會昏昏欲睡,無法正視那些學術般的話語;如果一昧嬉笑打罵,沒有的紮實的知識灌輸在博文上,一些技術草草講過,那可能沒有靈魂沒有看的價值。於是我想做個嘗試,一邊來完成我高中時期的夢想將小說寫下去,一邊也能在給博友閒來無事看小說的時候點綴些技術知識的分享在字裡行間,我不知道自己能不能用自己的文字契合好,但只能盡力去做了,如有怪異的感覺,歡迎在評論區指出。
“也許換一扇窗戶,技術男和文藝青年兩個靈魂也是可以共存的”
第一章:聖林,初相遇
聖林大學,華夏國有名的綜合性重點私立大學,來到這裡的學生非富即貴,亦或者有著驕人的學習成績,聖林大學所在的聖林市,更是有水城之稱的國家模範城市,很多著名的企業都紛紛來這裡投資,聖林市和燕京、申城並稱為華夏國三大城市。
......
開學伊始,聖林大學前,人烏壓壓的擠著,燥熱的天氣配上擁擠帶來的煩躁感彷彿能把全身上下的每個細胞擠破。
安曉雅穿著藍色的流光裙、拖著笨重的行李箱吃力的走著,臉上的微笑卻看不出她的疲憊,這與周圍人不耐煩的表情形成了鮮明的對比,是的,她很開心,考入聖林大學是她夢寐以求的事情,她做到了,不僅如此,她還是和她心目中暗寐的那位一塊考入的......想到這,她心裡更加的美滋滋了,開始幻想著自己即將到來的大學生活。
也許是女孩思考的太沉迷了,不遠處一輛火紅的蘭博基尼跑車朝她所在的方向奔來她也絲毫沒有察覺,隨著跑車猛地踩下剎車停在了離她不到5公分的地方,安曉雅這才如夢初醒,嚇得摔倒在地。
“好痛!”安曉雅匍匐在地上低吟到。吃痛的表情在她不施粉黛卻十分美麗的臉上流露出,惹人同情。
周圍人早已怒目而視,本來現在是新生報到的日子,人已經夠多了,居然還有人開車來,開車就開車,居然還是限量款的蘭博基尼跑車,還把這麼一位小美女給撞了,大家的仇富心態和內心的不平衡致使他們同仇敵愾,紛紛譴責起車裡的人。
車上的人似乎沒有下車的打算,皺起的眉頭在他濃密的劉海間若隱若現,“新生真是麻煩。”蘇憂心裡暗想道。
正當蘇憂考慮要不要下車一趟的時候,有人毫不客氣的踢了他的愛車兩腳,一個清澈的女音響起:“開個跑車有什麼了不起,你以為你是誰啊,快下車道歉!”
只見一位穿著黃白相間格子衫,寬鬆牛仔褲,小白鞋,扎著利索馬尾辮的女孩好心的攙扶起安曉雅,怒視著跑車的方向。曉雅輕聲說道:“謝謝學姐。”
蘇憂抬頭一瞥,一瞬間的內心慌亂接著轉為妖孽的嘴角一笑:原來是她。
是的,蘇憂是認識她的,但她或許並不認識蘇憂,故事還在2個月前,那時候剛放暑假,夏沫她以暑假實習為名去參加過星宇科技公司的面試,而那一天,蘇憂被父上大人以熟悉公司業務為名,派他去了蘇氏集團下的子公司星宇科技學習,說是學習,真的到了公司後,又有誰敢管,剛巧有一天公司在招實習生,蘇憂覺著看面試挺好玩,就提前躲在面試會議室的暗間處,觀察著整個面試過程,當然,面試官和麵試者是看不到蘇憂的。
整個面試無聊透頂,蘇憂都懷疑自己做錯了決定,整個人聽得昏昏欲睡,直到夏沫的到來......
面試官:"姓名?"
夏沫:“夏沫.”
面試官:“性別?”
夏沫瞪大了雙眼:“啥?你這是面試還是審問犯人啊,性別這麼明顯看不出來麼”
面試官頭都沒抬起來,似乎沒注意夏沫話裡的火氣,嘀咕到:“才讀一年大學,還是女的,面試簡直浪費時間,不知道HR咋篩選的簡歷,這都能給放過來”
也許面試官曾被前女友拋棄曾被女程式設計師拒絕過求愛亦或者是面試一整天有些不耐煩了,也根本沒意識到蘇大少在暗間觀察,居然在面試過程中如此出言不遜。蘇憂也有些不喜,決定一會出去後好好和張和(面試官)交流交流感情。
夏沫怒了,你以為大夏天的我想出來面試啊,我難道不想美滋滋的在空調房裡吃水果追劇看歐巴,這不是想攢點資歷,為將來申請推免研究生準備麼!!!
想罷,站起來一拍桌子,朝面試官說到:“讀一年大學怎麼了,女的又怎麼了,有本事你考考我!”
面試官彷彿來了興趣,也許是想著將她一次性打擊到,不緊不慢的說到:"快取擊穿、穿透、雪崩是什麼情況,如何解決?"
這個Redis相關的問題對於一個工作一兩年的人或許回答起來遊刃有餘,但對於一個剛讀了大學一年還沒接觸實際專案的人來講,確實有點為難。
夏沫沉默不厭,內心卻爆起了粗口,“擊穿穿透雪崩這都是啥東西,雪山崩塌了麼?我TMD怎麼知道!”
張和看夏沫不說話,輕蔑的笑了下:“怎麼著,不會啊?問你個基礎的,HashMap的實現原理是什麼?”
夏沫怒了,反手拿起面試官的水杯,將水潑到了面試官的臉上:“雜湊你大爺!”說罷,便直接走了,留下一道倩影,面試官一個人在那目瞪口呆半天緩不過神來,好一會兒才想起來喊保安。可此時的夏沫已經拉著等待自己的閨蜜離開了星宇科技,閨蜜看見夏沫一臉怒氣的出來,便詢問發生了什麼?夏沫沒好氣的說:“我潑了面試官一臉水。”“啥,你瘋了啊姑奶奶,平時胡鬧就罷了,怎麼面個試還捅婁子,聽說他們社會人報復心理很強的!”閨蜜一臉擔憂到。“誰讓他看不起女程式設計師,”說完前半句夏沫又陰險一笑,“放心吧,我留的手機號,身份證號以及學校都是假的,夏媽媽曾經說過,社會很複雜,不要輕易透露個人資訊,所以他想報復我也找不到我。”“哈哈,你牛!”
......
蘇憂停止了回憶兩個月前的事情,沒想到會在這碰到她,當初他曾尋過她,可沒想到她留下的一切資訊都是假的,只能期待有緣再見。至於當時的面試官張和,在蘇憂和他長達30秒的交心後,張和就莫名其妙的提交了辭呈,嘆息的離開了崗位。
蘇憂開啟了車門,一身黑色皮衣打扮顯得硬氣逼人,他緩緩摘下墨鏡,一股子陽剛之氣在他眉宇間迸射出,吸引著周圍人群中的女性一陣陣騷動,就連夏沫,也呆住了幾秒。蘇憂看了眼受傷的安曉雅,又把目光移到了夏沫身上,緩緩問道:“計算機系的女程式設計師?”夏沫詫異了一下:“你怎麼知道?”蘇憂故作一副嫌棄的表情:“就你這身沒品位的打扮,格子衫的標配,用腳丫子都能猜出來。”夏沫氣的咬牙切齒:“你才衣服沒品呢,你人更沒品,撞了人都不知道道歉,沒男子風度,恬不知恥!”
蘇憂沉默下不知道在思考些什麼,突然想到了什麼可笑的事情:“這樣吧,為了表達對你計算機系的尊重,金融系的我隨便問你幾個計算機相關的問題,如果你能答上來,我不僅會向這位小學妹當眾道歉,還會請在場的所有人去敦煌大酒店吃飯。但是如果答不上來,你就得滿足我一個你力所能及的請求,放心,不會是違背道德和良心的事情。”周圍人一片唏噓,敦煌大酒店,那可是聖林市最高規格的酒店了,平時普通人想都不敢想,於是便有人鼓吹到:“美女別怕他,去應戰,他一個金融系的計算機相關知識怎麼會比得過你。”夏沫也很糾結,其實她基礎知識不差,大一還拿了一等獎學金,而且她參加完那次面試後還回來很狠的閉關修煉了一陣,再說,一個金融系的即使學過幾天計算機又能懂多少,想到這,便鼓足了勇氣,說:“我答應你了,你問吧。”安曉雅此刻卻覺得不對勁,拉了拉夏沫衣角暗示她別衝動。夏沫拍了怕她的手,讓她別擔心。
蘇憂腦子裡在思索著兩個月前他在辦公室看過的那本招java程式設計師的面試題,沒錯,他是位記憶力驚人的天才,當時雖然只是隨意翻看下,但就是很奇怪的印在了他的腦海裡。蘇憂緩緩問道:“你聽好了,HashMap的底層實現原理是什麼?”夏沫愣了一下,感覺這個問題曾經有人問過她一樣,略加思考便緩緩說道:“第一:HashMap是根據雜湊表(hashing)的原理,通過put(key,value)和get(key)實現了儲存資料和獲取資料。第二:HashMap在儲存資料時,會呼叫put(key,value)方法,此時他會呼叫一個hashcode(雜湊函式),通過這個雜湊函式會計算出對應的hash值,這個 hash值其實就是一個bucket的位置,能確定在雜湊表上的一個位置,當然這個雜湊表就是一個陣列,能將value值存進去。第三:HashMap在獲取資料時,會呼叫get(key)的方式,此時他也會呼叫雜湊函式求出key的雜湊值,找到在雜湊表上的位置,然後取出資料。第四:還有一種情況就是發生hash碰撞了,就是不同的key通過雜湊函式計算出來的雜湊值是一樣的,這時候就會把這不同的資料都存在hash表的那個位置,只不過那個單元裡儲存的結構是連結串列,查詢時就先找到雜湊表的那個位置,然後通過遍歷連結串列的方式通過比較key值來找到正確的鍵值對key-value”震驚,大寫的震驚!周圍人都驚呆了,原來不止男學霸很帥,女學霸也同樣很女神的!
蘇憂笑了一下:“不錯,有兩把刷子,那你再告訴我JDK8中的HashMap的底層資料結構。”“在JDK8中,HashMap的底層採用的是陣列 + 連結串列 + 紅黑樹的資料結構,連結串列長度變為8並同時滿足HashMap中元素大於64時則變為紅黑樹,當連結串列長度小於6時又變回連結串列。”夏沫不懼的回答到。“為什麼HashMap的底層中連結串列長度大於8變為紅黑樹,小於6變為連結串列,臨界值不一樣呢?”蘇憂繼續追問道。夏沫得意的撥了一下自己的碎劉海:“你聽好了,首先要知道紅黑樹TreeNode佔用的空間是普通Node(連結串列)的兩倍,這也算是為了一個時間和空間的均衡,其次呢,這也是為了遵循泊松概率,在達到8個元素時概率為千分子一,而此時連結串列的效能也很差了,在這種極端的情況下才會把連結串列轉化為紅黑樹。通常情況下很難達到8,都會是使用連結串列,二紅黑樹算是一種提高效能的應對策略。還有就是,臨界值設定一樣的話,在極端情況下容易發生樹化和非樹化的轉換,影響效能。連結串列往紅黑樹轉化的話需要一定的過程。”
周圍的人看呆了,就算是計算機系的一些學長學姐也自愧不如,他們是學過一些資料結構,也瞭解過Hash表,但是這些複雜的變化彷彿是存在那些非重點標註的內容裡面吧,老師說過期末不考的。。
其實這也算是夏沫幸運,自從兩個月前被張和麵試時問了HashMap相關的問題沒答上來,自己就回來後各種百度,狠狠惡補了下相關知識,所以這才應對自如,等等,夏沫似乎想到了什麼,“他為什麼會一再追問我HashMap相關的知識.....且看他下一個問題還問我什麼。”
夏沫也許是有些飄了:“我再給你兩個問題的機會。”蘇憂有些意外但也不著急,即使真被她全答對,請大家去敦煌大酒店吃飯也不是做不到,反而還有機會把酒言歡,便繼續問道:“你聽好了,那請你告訴我JDK7和JDK8中HashMap的區別,起碼從五個方面回答我奧!”這次夏沫想的時間長了一些,在努力的回憶些什麼,她有些不確定的回答到:“一:底層結構的不同,jdk7是陣列+連結串列,儲存節點資料Entry,JDK8則是資料+連結串列+紅黑樹的方式儲存Entry。Jdk8當連結串列長度大於8同時HashMap中的元素個數大於64時則轉換為紅黑樹;二:Hash衝突時插入資料的方式是不同的,JDK7採用的是頭插法,JDK8採用的是將節點插入到連結串列尾部;三:Hash函式是不一樣的,jdk7直接使用的key的hashcode值計算,擾動複雜,雜湊函式複雜,5次異或加4次位運算 ,一共是9次擾動,這也是為了實現雜湊。jdk8則是採用key的hashcode異或上key的hashcode進行無符號右移16位的結果,結果更加的雜湊,但是擾動卻簡單了,是一次異或加一次位運算;第四:是擴容策略的不同,jdk7會重新的計算hash,不小於threshold閾值直接2倍擴容。jdk8中不會重新計算hash,看看原來的hash值新增的那個bit是1還是0就好了,是0的話索引沒變,是1的話索引變成原索引加上舊的陣列長度。至於第五....”夏沫有些頭痛,她怎麼沒記得還有第五條,“你是不是忽悠我,我怎麼不記得有第五條?”夏沫不確定的問蘇憂。蘇憂白了她一眼說:“程式設計師小姐,給你個提示,當hash表剩餘空間為空時,它們.....”“JDK7會先呼叫inflateTable()初始化一個陣列,而1.8則是直接呼叫resize()進行擴容。”夏沫搶答到,“這可是我自己想起來的,可不是你告訴我的。”
“不錯不錯,還算有點腦子,配得上我在這和你耗了10多分鐘。”蘇憂陰險的笑了笑,“你聽好了,JDK8中HashMap原始碼中新增資料是怎麼樣一步步實現的,記著,我說的是原始碼奧。”陰險,大寫的陰險,居然問一個剛上大學一年的原始碼問題,這種問題即使工作了三四年也不一定知道啊!周圍變的靜謐起來,都看向了夏沫,期待此刻奇蹟的發生。夏沫此刻也沉默了下來,沒有思考也沒有任何回答,是的,她確實不會,原始碼這東西太深,她還未曾接觸到。
“首先判斷Node[] table成員變數是否初始化,如果沒有,則呼叫resize進行擴容,這個Node型別的陣列儲存了HashMap真正的資料。接下來,通過傳入鍵值對的key的hashcode和容量,馬上得到該對映所在的table陣列的下標,並通過陣列的取下標操作,得到該雜湊桶的頭節點。如果沒有發生hash碰撞(頭節點為null),那麼直接執行新增操作,如果發生了hash碰撞(頭節點不為null),那麼分兩種情況:一是與桶內的某個元素‘==’返回true,或者equals判斷相同,執行替換操作;二是如果與桶內的所有元素不相等,執行新增操作,可能是連結串列也可能是紅黑樹的插入。接下來連結串列新增操作後會有兩個判斷:如果雜湊值是單連結串列結構,且桶內的數量超過了8,且size大於等於了64,那麼該雜湊桶轉換為紅黑樹結構;如果新增的size大於了threshold,那麼呼叫resize擴容。不知道我的回答可讓你滿意。”人群中突然傳了一個清澈的男子聲音,一名男子緩緩走上前來,只見他身體瘦弱,臉色蒼白,四周還留著鬢角和燕尾,一身白衣,黑框眼鏡,像極了2012年那會兒盛行非主流的男孩打扮,不過相貌尚可,算的上是中上游,難得的是他的眼神乾淨堅毅,似乎未被塵世所同化。
“梓然哥哥。”安曉雅開心的朝那個看起來弱不禁風的白衣男子喊道。
白衣男子笑了笑:“不好意思曉雅,我來晚了。”
說罷,路梓然走到蘇憂的面前,兩個人四目相對,這兩個男人之間彷彿隨時會出現一道道電閃雷鳴,一個身材健壯麵容陽剛俊美,身高足有187,另一個看起來大病初癒孱弱不堪,只有178的高度。“我的妹妹需要一個道歉。”路梓然不容拒絕的說到。
......
好吧,我們的男主終於姍姍來遲,在第一章結束的時候趕到了。
“猶記得初相逢,丹心同,年少懵懂。回首處望蒼穹,千里共當時明月終。”
後言:
真正的男主在結尾處姍姍來遲,真正的女主還沒出現,可能這樣強行的將小說和技術融合在一塊有種怪異的感覺(反正我是覺得挺怪的),一個26歲的程式設計師又開始寫起了學生時代的言情小說,有種爺青回的感覺,可能人物刻畫的還不夠形象,後期會慢慢調整修復。當然,如果有技術上的內容闡述的有誤或者不全也麻煩給指出來,多謝多謝。