2013-07-09 51 views
0
class Employee 

{ 

    private String name; 
    private int age; 
    private int empid; 

    public Employee(String name, int age, int empid) 
    { 
     super(); 
     this.name = name; 
     this.age = age; 
     this.empid = empid; 
    } 
} 

如何修改上面的類,因此它可以被用作HashMap中修改類,以便它可以被用作HashMap中的關鍵字

關鍵
+6

重寫'Object.hashCode()'和'Object.equals(Object)'。 –

+0

'super();'?你在擴展什麼? – alfasin

+0

@alfasin'Object'(看起來像構造函數是自動創建的,'super()'調用是自動插入的) – arshajii

回答

4

基本上有三件事情需要一個類來完成你想在散列表中用作關鍵字。首先讓類不可變,然後重寫hashCode方法,第三重寫equals方法。

使類不可變。這裏有一些規則的不變性:

  • 使該類最終
  • 使所有成員最終,將它們明確,在靜態塊,或在構造
  • 使所有成員私人
  • 沒有修飾狀態的方法

瞭解更多有關本教程創建不變類:

http://javarevisited.blogspot.in/2013/03/how-to-create-immutable-class-object-java-example-tutorial.html

要了解重寫的hashCode和equals方法,遵循這樣的:

http://javarevisited.blogspot.in/2011/02/how-to-write-equals-method-in-java.html

+1

雖然一個好主意,關鍵是不可變的不是要求 –

0

它可以在一個HashMap中使用了。 全部 Java對象有一個hashCodeequals方法,這是散列圖工作的必要條件。

Map<Employee, Whatever> theMap = new HashMap<Employee, Whatever>(); 
+1

*可以*'!='*應該* – arshajii

+0

是的,但垃圾進入,垃​​圾出來。如果你使用實例化的對象,讓它們在地圖中變得沒有意義,那麼你不能指望得到驚人的結果。 – tsm

0

爲了一類用作有效的哈希映射鍵,類應該重寫既equalshashCodehashCode變量返回一個int值,用於計算此特定對象的低級別查找索引。

使類不可變也是一個好主意,就像hashCode改變中程序一樣,你的鍵現在是無用的。

0

你沒有頂尖的事情。所有類都擴展了Object類。由於在Object類中定義了方法hashcode()equals(),任何類都可以用作關鍵字。

但是,如果您確實將您的類用作HashMap鍵,則應該重寫這兩種方法。

如果您使用Eclipse作爲IDE,它可以爲您生成這兩個函數。
只要在源代碼中的任意位置執行Richtek 生成Hashcode()和equals()。

0

將自定義類作爲HashMap中的鍵的充分條件。

1. Override equals and Hashcode - good practice. 
     Read Item 8 and Item 9 from Effective Java (must Read) for 
     the general contract among them. 
    2. Try to make your Class Immutable. Atleast 
     those fields should be final/immutable on which your hashcode 
     and equals depend. So that you hashcode/equals in dosen't fail later 
     in your program 

如果你認爲你想檢查僅參考平等(不推薦),然後使用IdentityHashMap。

相關問題