[英]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
對象屬於不同的類 (更像SalaryPerson
和CarPerson
),或者您不能更改它們,則可能要實現一個PersonKey
類,該類提取與相等性相關的數據(名稱,...)並使用這作為關鍵。
根據Integer類的JavaDoc,如果兩個整數對象都具有相同的int
值,則Integer.equals(Integer)
返回true。 換句話說:在Hashtable
使用Integer
作為鍵將通過鍵的整數值檢索對象。
Object.hashCode()
必須與equals
保持一致 。 簡而言之,如果您覆蓋equals
,則還必須覆蓋hashCode
,並確保它為所有equals
對象返回相同的哈希碼。 final
字段 salaries
和cars
。 HashMap<K,V>
在Java中比Hashtable<K,V>
更常見。 通常僅在需要同步實現時才使用哈希表。 equals
和hashCode
。 equals
深入文章,請參見Angelika Langer的“ equals()的秘密”。 根據對象相等性檢索哈希表中的鍵。 因此,如果在Person類中重寫了equals和hashcode,則完全有可能從2個不同的哈希表中檢索值。
也可以使用整數。 就像從兩個哈希表中檢索鍵“ 1”的值一樣。
使用Keys在Cars HashTable中查找對應的汽車是否有效
當然是啦
為了提供這種可能性,您應該重寫hashCode
和equals
方法並實現比較兩個值的方式-例如(假設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.