歡迎訪問昆山寶鼎軟件有限公司網站! 設為首頁 | 網站地圖 | XML | RSS訂閱 | 寶鼎郵箱 | 后臺管理
?

探灵笔记第三个鬼:新聞資訊

MENU

軟件開發知識

HashMap?口試? CAD加密 我是誰?我在哪

點擊: 次  來源:寶鼎軟件 時間:2019-01-10

原文出處: 卓慶森

探灵笔记小皮美颜版 www.pfyvo.icu 此刻是晚上11點了,昆山軟件開發,學校屠豬館的自習室因為太晚要封鎖了。勤奮且疲勞的小魯班也從屠豬館出來了,正籌備回宿舍洗洗睡,由于自習室位置較量荒僻所以是吸收不得手機網絡信號的,因此小魯班從兜里掏脫手機的時候,信息可真是炸了呀。小魯班心想,微信群平時都沒什么人談天,今晚必定是產生了什么大事。仔細一看,才發明本來是小魯班的室友達摩(禿頂)拿到了阿里巴巴 Java 開拓實習生的 Offer,此時小魯班真替他室友感想興奮的同時,心里也不免會發生一絲絲的失落感,那是因為本身投了許多份簡歷,別說拿不拿獲得 Offer,就連給口試邀的公司也都鳳毛麟角。小魯班這會可真是受到了一萬點真實暴擊。不外小魯班照舊很樂觀的,很快調解了心態,帶上耳機,逐步的走回了宿舍,正規劃籌備向他那神室友達摩取取經。

半晌后~

小魯班:666,傳聞你拿到了阿里的 Offer,能透露一下口試內容和能力嗎?
達摩:嘿嘿嘿,沒問題鴨,啼聲爸爸我就匯報你。
小魯班:耙耙(外貌笑嘻嘻,心里MMP)
達摩:其實我也不是很記得了(請繼承裝),但我照舊記得那么一些。假如你是面的 Java,首先雖然是JAVA的基本常識:數據布局(Map / List / Set等)、設計模式、算法、線程相關、IO/NIO、序列化等等。其次是高級特征:反射機制,并發與鎖,JVM(GC計策,類加載機制,內存模子)等等。
小魯班:問這么多內容,那豈不是一小我私家都口試好久嗎?
達摩:不是的,口試官一般城市用連環炮的方法提問的。
小魯班:你說的連環炮是什么意思鴨?
達摩:那我舉個例子:

  • 就好比問你?HashMap 是不是有序的?你答復不是有序的。
  • 那口試官就會大概繼承問你,有沒有有序的Map實現類呢?你假如這個時候說不知道的話,那這塊問題就到此竣事了。假如你說有 TreeMap 和 LinkedHashMap。
  • 那么口試官接下來就大概會問你,TreeMap 和 LinkedHashMap 是如何擔保它的順序的?假如你答復不上來,那么到此為止。假如你說 TreeMap 是通過實現 SortMap 接口,可以或許把它生存的鍵值對按照 key 排序,基于紅黑樹,從而擔保 TreeMap 中所有鍵值對處于有序狀態。LinkedHashMap 則是通過插入排序(就是你 put 的時候的順序是什么,取出來的時候就是什么樣子)和會見排序(改變排序把會見過的放到底部)讓鍵值有序。
  • 那么口試官還會繼承問你,你以為它們兩個哪個的有序實現較量好?假如你依然可以答復的話,那么口試官會繼承問你,你以為尚有沒有比它更好可能更高效的實現方法?
  • 無窮無盡深入,直到你答復不出來可能口試官認為問題到底了。

    小魯班捏了一把汗,我去……這是妖怪吧,那我們來試試唄(因為小魯班方才在自習室才看了這章的常識,想乘隙裝一波逼,究竟方才叫了聲爸爸~~)

    于是達摩 and 小魯班就開始了對決:

    1、為什么用HashMap?

  • HashMap 是一個散列桶(數組和鏈表),它存儲的內容是鍵值對 key-value 映射
  • HashMap 回收了數組和鏈表的數據布局,能在查詢和修改利便擔任了數組的線性查找和鏈表的尋址修改
  • HashMap 長短 synchronized,所以 HashMap 很快
  • HashMap 可以接管 null 鍵和值,而 Hashtable 則不能(原因就是 equlas() 要領需要工具,因為 HashMap 是后出的 API 顛末處理懲罰才可以)
  • 2、HashMap 的事情道理是什么?

    HashMap 是基于 hashing 的道理

    我們利用 put(key, value) 存儲工具到 HashMap 中,利用 get(key) 從 HashMap 中獲取工具。當我們給 put() 要領通報鍵和值時,我們先對鍵挪用 hashCode() 要領,計較并返回的 hashCode 是用于找到 Map 數組的 bucket 位置來儲存 Node 工具。

    這里要害點在于指出,HashMap 是在 bucket 中儲存鍵工具和值工具,作為Map.Node 。

    HashMap?面試? CAD加密 我是誰?我在哪

    以下是 HashMap 初始化

    簡化的模仿數據布局:

    Node[] table = new Node[16]; // 散列桶初始化,table
    class Node {
        hash; //hash值
        key; //鍵
        value; //值
        node next; //用于指向鏈表的下一層(發生斗嘴,用拉鏈法)
    }

    以下是詳細的 put 進程(JDK1.8)

    1. 對 Key 求 Hash 值,然后再計較下標
    2. 假如沒有碰撞,直接放入桶中(碰撞的意思是計較獲得的 Hash 值溝通,需要放到同一個 bucket 中)
    3. 假如碰撞了,以鏈表的方法鏈接到后頭
    4. 假如鏈表長度高出閥值(TREEIFY THRESHOLD==8),就把鏈表轉成紅黑樹,鏈表長度低于6,就把紅黑樹轉回鏈表
    5. 假如節點已經存在就替換舊值
    6. 假如桶滿了(容量16*加載因子0.75),就需要 resize(擴容2倍后重排)

    以下是詳細 get 進程

    思量非凡環境:假如兩個鍵的 hashcode 溝通,你如何獲取值工具?