關於hashCode和equals方法的有趣面試題


在我Java程式設計生涯中遇到的最有趣的面試問題之一是關於hashCode和equals方法的。面試官總是會檢查候選人是否瞭解equals()和hashCode()方法,因為它們是Java Object類中最重要的,也是最容易混淆的方法。這兩種方法都用於檢查兩個或多個物件的相等性。本文旨在提供一些與hashCode()和equals()方法相關的有趣面試問題,以提高一個人的知識和技能。

Java面試題:hashCode()和equals()方法

當面試官開始詢問hashCode()和equals()方法時,第一個問題可能是:你瞭解hashCode()和equals()方法嗎?所以,讓我們從這個問題開始我們的討論。

Java中的hashCode()和equals()方法

hashCode()方法返回物件的雜湊碼值。雜湊碼是一個整數,為Java中的每個物件生成。如果我們比較兩個物件,如果這兩個物件根據equals()方法相等,則返回相同的雜湊值;否則返回不同的雜湊值。

預設情況下,equals()方法只比較物件的記憶體位置,即它檢查給定的物件是否引用同一個物件。但是,我們可以重寫此方法,並在其中加入我們自己的邏輯來比較給定物件的value。如果兩個物件相同,則返回true;否則返回false。

可以在哪個包中找到hashCode()和equals()方法?

這些方法存在於`java.util`包的`Object`類中。Object類是Java中每個類的超類。

列出與hashCode()方法相關的約定

以下是與hashCode()方法相關的約定列表:

  • 如果根據equals方法,兩個物件相等,則它們必須具有相同的雜湊碼。

  • 如果兩個物件具有相同的雜湊碼,則根據equals方法,它們可能相等,也可能不相等。

  • 物件的雜湊碼在其生命週期內不應改變,除非影響其相等性的屬性發生改變。

列出與equals()方法相關的約定

以下是與equals()方法相關的約定列表:

  • 它是自反的,這意味著對於任何非空物件obj,obj.equals(obj)應該返回true。

  • 它是對稱的,這意味著對於任何非空物件obj1和obj2,如果obj1.equals(obj2)返回true,當且僅當obj2.equals(obj1)返回true。

  • 它是傳遞的,這意味著對於任何非空物件obj1、obj2和obj3,如果obj1.equals(obj2)返回true並且obj2.equals(obj3)返回true,則obj1.equals(obj3)應該返回true。

  • 對於任何非空物件obj,obj.equals(null)應該返回false。

解釋hashCode()和equals()方法的重要性

hashCode()和equals()方法很重要,因為它們定義了物件在儲存在依賴於雜湊的集合(用於將物件對映到整數值)中的行為,例如HashMap或HashSet。這些集合使用物件的雜湊碼來確定其在底層陣列中的槽,然後使用equals方法來檢查衝突或重複項。如果hashCode和equals方法實現不正確,則集合可能無法正常工作,並可能產生意外的結果。

是否需要同時重寫hashCode()和equals()方法?

我們應該始終同時重寫這兩種方法,因為它們需要維護一個約定。如果我們只重寫其中一種方法,我們可能會破壞約定並導致不一致。第二點是,我們需要在兩種方法中使用相同的屬性或欄位來確定物件的相等性。例如,如果我們在equals方法中使用name和age,我們也應該在hashCode方法中使用它們。

解釋雜湊集合的衝突術語

在雜湊過程中,多個物件在透過內建方法'equals()'進行評估後可能會得到相同的整數值,這會導致稱為衝突的情況。當兩個或多個鍵具有相同的雜湊值並對映到同一個桶時發生這種情況,從而導致效能下降。

Java中"=="和equals()方法的區別是什麼?

“==”和equals()方法都用於比較兩個實體,並且它們在比較時也會檢查物件的記憶體位置。但是,我們不能重寫“==”運算子,當我們必須比較兩個基本值時,最好使用此運算子。

結論

本文闡述了equals()和hashCode()方法在Java面試中的重要性。我們討論了關於hashCode()和equals()方法的一些重要且有趣的面試問題。在理解了討論的問題後,可以輕鬆應對面試。

更新於:2023年8月17日

瀏覽量:593

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.