Hashmap 面試問題和答案 [適用於初學者和有經驗者]
已發表: 2020-09-24java.util.HashMap 類是迄今為止最重要的 Java 庫之一。 很少有項目是用 java 編寫的,並且在實現中不使用 HashMap 庫。 正是這種數據結構的實現方式,使得這對於任何與 Java 相關的程序來說幾乎都是必不可少的。 HashMap,在其定義中,非常簡單。 HashMap 是一種使用非常表格化的方法實現的數據結構。
正確地說,如果只有一種數據結構,它應該是 HashMap。 這不僅非常有用,而且非常節省時間。 HashMap 中的簡單查找只需要大約 O(1) 時間(這意味著 HashMap 中的所有查找都是在恆定時間內完成的)。 您會在 Java 編程語言中找到許多 HashMap 的實現,例如 HashTable、concurrenthashmaps 等。但是,如果您正在尋找一個通用的實現,您不應該遠離基本的 HashMap。
HashMap 的這些實現中的每一個都有自己的一組特性和用例。 如果您希望保留編寫映射的順序,您應該考慮使用 Linked HashMap。 如果您希望對您的映射進行排序,那麼您應該使用 HashMap 的 TreeMap 實現,它會為您進行排序。
以類似的方式,如果您正在尋找一個碰巧是線程安全的哈希表,它也可以在並發應用程序中使用,同時保持可伸縮性,您將看到一個並發 HashMap。
如您所見,可以通過多種方式使用 HashMap。 要真正了解 HashMap 的重要性,您應該查看任何軟件工程工作簡介的面試問題。 如果您不知道如何正確實現 HashMap,您將無法正確優化時間。 所以,如果你是一名程序員,你就離不開學習 HashMap 的來龍去脈。 所以我們在下面列出了一些優秀的 hashmap 面試問題,這些問題應該可以幫助你為下一次面試做準備。
從世界頂級大學在線學習數據科學課程。 獲得行政 PG 課程、高級證書課程或碩士課程,以加快您的職業生涯。
目錄
Hashmap 面試問答
Q1。 你將如何在 Java 中使用 HashMap 的 put() 方法?
答。 put() 方法簡單地通過利用稱為散列的原理來工作。 您將使用此函數將相關對象存儲到後端(這是一個內存數組)。 您必須將另一個函數與此 put() 函數一起使用,才能確定該對像在後端的確切位置。 hashcode() 函數用作 put() 的輔助函數,就像我們之前描述的那樣。
因此,這兩個函數協同工作的方式是它們去後端搜索可用的密鑰和內存位置。 如果它們碰巧發生碰撞,則具有兩個值(即鍵和值的值)的對象然後被添加到列表的動態實現中,也稱為鍊錶。 這裡的點贊列表存儲在之前找到的內存位置。
Q2。 一個對象需要具備哪些基本需求才能用作 HashMap 的鍵或值?
答。 我們在任何 HashMap 及其實現中使用的鍵和值都應該在其中編寫這兩個函數。 這兩個函數的名字是equals()和hashcode()。 當我們在任何 HashMap 中插入鍵的值時,使用名為 hashcode() 的函數。 同時,只有當我們試圖取回已經存儲在 HashMap 中的值時,才會調用 equals() 函數。
Q3。 假設您忘記了已在 HashMap 中使用的鍵。 您要添加的下一個鍵已經存在於 HashMap 中。 你認為在這種情況下會發生什麼?
答。 如果你覺得應該有錯誤,如果我們不討論HashMap,你就不會錯。 但是,如果您正在使用 HashMap 並且碰巧插入了一個其值已經存在於 hashmap 中的鍵,則 java 編譯器不會拋出任何錯誤。 相反,編譯器只會去查找與您輸入的鍵關聯的值,並且只會更新那裡的值。
如果您使用函數 put() 將值添加到哈希圖中,則此函數的返回值將是與該鍵關聯的舊值。 因此,讓我們假設對於鍵 A,您存儲的值為 1。如果您現在將 A 的值設為 50,那麼 put() 函數將返回的值將是 1 ,並且存儲在鍵 A 中的最終值將是 50。
Q4。 如果需要存儲空值。 在這種情況下你能使用 HashMap 嗎?
答。 是的,在這種情況下,我們可以毫無問題地使用 hashmap,因為 hashmap 不會減少您可以存儲的值。 您可以在任何哈希圖中存儲任意數量的空值。
Q5。 Java中的hashmap實現如何處理衝突?
答。 java.util.HashMap 的代碼庫使用鏈接的方法來處理衝突。 這種鏈接的工作方式是將包含鍵和值對的哈希映射的任何新條目存儲在一個鏈接列表中,然後該列表將存儲在哈希映射的現有數據所在的位置(存儲桶位置) .
如果您在哈希圖中擁有的所有鍵都具有相同的哈希碼,那麼您的哈希圖將不再是哈希圖。 它將變成一個鍊錶。 查找時間將增加一階 (o(1)),即恆定時間,到階 N (O(N)),即線性時間。
Q6。 您能否在 java 的 hashmap 實現中存儲具有空值的鍵?
答。 是的,在 java 的 hashmap 實現中,您將能夠存儲具有空值的鍵。 但是您只能存儲一個這樣的密鑰,該密鑰將始終存儲在存儲桶列表的開頭。 hashmap 不會在這裡調用函數 hashcode() ,因為如果該函數用於空鍵,它將拋出空指針異常錯誤。 如果您希望將哈希圖的第一個索引返回給您,則必須使用 get 函數而不是使用 null 值作為鍵。

閱讀:數據結構中的排序:類別和類型
問題 7。 您認為 hashmap 旨在模仿哪種數據結構?
答。 哈希圖應該模仿哈希表數據結構的外觀和功能。 如果您想以鍵值對的形式存儲值,哈希表數據結構是您的理想選擇。 首選此哈希表的主要原因是查找時間。 因此,如果您有要搜索的密鑰,那麼只需按一個或恆定時間的順序,您就可以取回您想要的值。
Q8。 由於 hashmap 不是結構或數組等核心數據結構之一。 每當您創建哈希圖時,您認為幕後發生了什麼? 您認為哪種數據結構的組合為我們提供了哈希圖?
答。 儘管 hashmap 實際上代表了一個 hashtable,但在底層,它並不是直接實現的。 我們使用兩個眾所周知的數據結構來為 hashmap 注入活力。 我們使用鍊錶和數組。 鍊錶用於動態存儲鍵值對,數組用於將所有這些鍊錶存儲到其中; 它們一起形成一個哈希圖。
從 Java 8 開始,如果鍊錶變得足夠大,那麼 Java 會代替鍊錶實現二叉搜索樹。 進行此更改是為了節省時間並提高 hashmap 的整體性能。
另請閱讀:數據科學面試問題
問題 9。 如果我們想在同一個鍵下存儲多個值,你認為在 Java 中的 hashmap 實現中是否可行?
答。 不,您將無法在哈希圖中存儲重複的鍵。 如果您嘗試將新值存儲在已存在於 hashmap 中的鍵中,則 hashmap 將簡單地刪除先前存儲在該鍵中的值並將其替換為新值。
在這種情況下,hashmap 的大小不會改變,這意味著不會在 hashmap 中添加鍵。 這個特性是我們使用函數 keyset() 來取回 hashmap 的所有鍵並且這個函數返回一個集合而不是集合的原因之一(因為在一個集合中所有值都必須是唯一的)。
問題 10。 你能在 HashMap 中存儲重複值嗎?
答。 是的,您將能夠在哈希圖中存儲重複值。 這就是您從哈希圖中檢索所有值的原因。 然後我們得到一個集合,而不是一個集合。 它沒有以列表的形式給出值,因為不能保證排序。
問題 11。 在 Java 的 hashmap 實現中,它是線程安全的嗎?
答。 不,普通的 Hashmap 在 Java 中根本不是線程安全的。 理想情況下,您應該避免將哈希圖共享給可以更改值並以任何形式或形狀編輯哈希圖的線程。 但是,您可以使用只讀哈希圖,然後將其輸入線程。 這樣,其中包含的值不會改變。
問題 12。 如果我們在使用多線程的應用程序中使用 hashmap,您認為會發生什麼?
答。 如果您碰巧將 hashmap 傳遞給使用多個線程的應用程序,並且這些線程中的每一個都可以修改、添加或刪除存儲在 hashmap 中的值,那麼構建 hashmap 的內部數據將被破壞. 用來形成hashmap的鏈接會丟失,hashmap就會失去結構,也就失去了它的用途。 因此,如果要在線程化的應用程序中使用它們,始終建議您始終使用線程安全的 hashmap。
問題 13。 如果我們想在 Java 中遍歷整個 HashMap。 我們可以通過哪些不同的方式來做到這一點?
答。 有很多方法可以在 java 中迭代 hashmap; 下面列出了其中一些:
- 您可以將函數 keySet 與迭代變量結合使用。
- 您可以將函數 enterySet 與迭代變量結合使用。
- 您可以使用函數 entrySet 並將其與增強的循環一起使用。
- 您可以使用 keySet 並獲取方法。
另請閱讀: Python 中的數據結構和算法:您需要知道的一切
接下來是什麼?
如果您想了解數據科學,請查看 IIIT-B 和 upGrad 的數據科學執行 PG 計劃,該計劃是為在職專業人士創建的,提供 10 多個案例研究和項目、實用的實踐研討會、與行業專家的指導、1與行業導師一對一,400 多個小時的學習和頂級公司的工作協助。
Hashtable 與 HashMap 有何不同?
非同步數據結構是 HashMap。 另一方面,Hashtable 是線程安全的,可以在多個線程之間共享,而無需同步代碼。 Hashtable 不允許一個空鍵或多個空值,但 HashMap 允許。 在非線程應用程序中應該使用 HashMap 代替 Hashtable。 簡單來說,HashMap 應該用在單線程或者非同步的應用中。
使用 HashMap 還是 TreeMap 更快?
在 TreeMap 中,值由鍵確定。 它不能有一個空鍵,但它可以有多個空值。 它與 HashMap 相同,除了不是升序,它保留升序(使用其鍵的自然順序排序)。 HashMap 採用基於數組的數據結構來根據散列函數組織其組件,作為基於散列表的實現。 對於 add()、delete() 和 contains 等大多數操作,HashMap 預測 O(1) () 的恆定時間性能。 因此,它比 TreeMap 快得多。
什麼時候使用 HashMap 而不是 ArrayList 更好?
只有當我們希望存儲的數據具有唯一鍵時,HashMap 才有意義。 當基於密鑰查找事物時,我們應該使用它,因為快速訪問時間是必須的。 當保持集合中條目的相同順序至關重要時,我們應該避免使用 HashMap。 它們彼此不同,並且服務於不同的目的。 如果要在 Java 中存儲對象,請使用 HashMap 將鍵映射到值,否則使用 ArrayList。