簡體   English   中英

重用Java中哈希表中的鍵

[英]Reuse keys in hashtable in java

如果我有一個像HashTable

HashTable<Person, Salary> Salaries

和一個無關的人

HashTable<Person, Car> Cars

所謂不相關,是指Person的Object引用應該是不同的,但是我們知道我們正在使用相同的Persons,並且具有相同的名字和姓氏。 我可以使用Salaries.entrySet()找到鑰匙,我知道那個人有車。 使用“密鑰”在“汽車哈希表”中找到相應的汽車是否有效? 如果使用Integer代替Person怎么辦?

簡短答案:

如果Person對象,您使用的存儲Salary對象到salaries的Hashtable和Person對象,您使用的存儲Car對象為cars Hashtable中是平等的 ,你可以使用一個檢索等。

現在,這意味着什么...

equal的含義由Object.equals(Object)定義。 如果不覆蓋此方法,則只有相同的對象相等,即實例僅等於自身 在這種情況下,您不能使用其他Person對象。

您可能要覆蓋equals以檢查代表對象是否相等。 顯然,這假定您可以修改Person類。

假設您要說的是同一類不同實例它們代表同一個人,而不是不同類的不同實例。

通常,對於同一個類的對象, equals應該僅返回true(即使子類也是一個問題)。 因此,如果您的Person對象屬於不同的類 (更像SalaryPersonCarPerson ),或者您不能更改它們,則可能要實現一個PersonKey類,該類提取與相等性相關的數據(名稱,...)並使用這作為關鍵。

使用整數作為鍵:

根據Integer類JavaDoc,如果兩個整數對象都具有相同的int值,則Integer.equals(Integer)返回true。 換句話說:在Hashtable使用Integer作為鍵將通過鍵的整數值檢索對象。

注意事項:

  • Object.hashCode()必須與equals 保持一致 簡而言之,如果您覆蓋equals ,則還必須覆蓋hashCode ,並確保它為所有equals對象返回相同的哈希碼。
  • 您必須確保在對象生存期內(或至少只要它們用作Hashtable的鍵...)不改變equal所使用的值-否則檢索將失敗! 通常建議在equals中使用的字段應為final字段

順便說說:

  • 根據Java代碼約定 ,變量名稱以小寫字母開頭。 因此,我稱呼您的哈希表salariescars
  • HashMap<K,V>在Java中比Hashtable<K,V>更常見。 通常僅在需要同步實現時才使用哈希表。

也可以看看:

根據對象相等性檢索哈希表中的鍵。 因此,如果在Person類中重寫了equals和hashcode,則完全有可能從2個不同的哈希表中檢索值。

也可以使用整數。 就像從兩個哈希表中檢索鍵“ 1”的值一樣。

使用Keys在Cars HashTable中查找對應的汽車是否有效

當然是啦

為了提供這種可能性,您應該重寫hashCodeequals方法並實現比較兩個值的方式-例如(假設Person類包含一些具有唯一值的id字段)

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    Person p = (Person) o;

    return getId().equals(p.getId());
}

@Override
public int hashCode() {
    return getId().hashCode();
}

然后,如果您看一下java.lang.Integer (1.8)的equals實現,您將看到

public boolean equals(Object obj) {
    if (obj instanceof Integer) {
        return value == ((Integer)obj).intValue();
    }
    return false;
}

public static int hashCode(int value) {
    return value;
}

這意味着該Integer類正在按值進行比較-因此它將滿足您的要求

這取決於不同的條件:

1)如果第一個HashTable的鍵集中的人員對象引用引用的是第二個HashTable中的完全相同的對象,則可以為該人員使用指向汽車的相同鍵。

2)有時候,兩個人的名字和姓氏相同,但對象不同。 在這種情況下,哈希值將不同,因此HashTable中的鍵。 在這種情況下,您不能使用相同的密鑰。

如果您在HashTable中使用整數作為鍵,則在您的情況下會很好。

希望這會有所幫助。

暫無
暫無

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

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