簡體   English   中英

可以使用員工 class 作為 HashMap 中的鍵嗎?

[英]Can one use an Employee class as a key in a HashMap?

說明:可以使用 Employee class 作為 HashMap 中的鍵嗎?

  • 了解覆蓋 hashCode
  • 了解覆蓋等於
  • 知道 hashCode 返回常量時的行為(包括 get 和 put 時間復雜度)
  • 知道 hashCode 未實現但 equals 是的行為
  • 如果實現了 hashCode 但未實現 equals 則知道行為
  • 知道將 class 用作密鑰時不可變是一個好主意。

是的,如果您正確設置了Employee class。 您發布的內容列表就是您通過執行此操作“證明”的內容。

Object.equalsjavadoc 和Object.hashCode的 javadoc列出了各種注意事項,例如:相等必須是自反的(這只是其中之一)。

如果您遵守所有這些注意事項,那么您可以使用 class 作為 hashmap 中的鍵。

鑒於您以這種方式提出了這個問題,這似乎很清楚,

[A] 你不知道這些東西,[B] 這是學習要求或工作申請的一部分。

結論很簡單:現在,你在這個任務上失敗了——你對這一切一無所知。 幸運的是,項目符號列表以及上面鏈接的 equals 和 hashCode 文檔為您提供了解決此問題的絕佳機會。 開始實驗,寫一個class,開始實現hashCode和equals。 看看會發生什么,做項目符號描述的事情(實現等於但不是哈希碼,看看當你創建 2 個看似相同的 Employee 對象時會發生什么,並注意如何將兩者都添加到 hashmap。違反相同“鍵”覆蓋的規則彼此)。

要記住一件事:

為了看到例如實現 hashCode 但不等於或反之亦然的問題,創建單獨的對象至關重要。 你想要這樣的東西:

Employee a = new Employee("Pooja");
Employee b = new Employee("Pooja");
Map<Employee, String> test = new HashMap<>();
test.put(a, "hello");
test.put(b, "world");
System.out.println(test.size());

這應該打印“1”。 如果您沒有正確執行文檔所說的操作,它將打印 2. 嘗試正確打印所需的內容 1. 嘗試當您故意弄亂例如 hashCode 和/或 equals 的實現時會發生什么。 弄清楚如果 hashCode 相同但 equals 表示它們不一樣會發生什么,等等。

像這樣的東西:

Employee a = new Employee("Pooja");
Map<Employee, String> test = new HashMap<>();
test.put(a, "hello");
test.put(a, "world"); // or
Employee b = a;
test.put(b, "goodbye");

觀察當你“弄亂”equals和hashCode時會發生什么並不是特別有用。

花一兩個小時,你就會在這個問題/測試/資格認證中獲得高分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM