3 回答

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
簡短的回答:
如果Person
用于將Salary
對(duì)象存儲(chǔ)到salaries
Hashtable 中的Person
對(duì)象與用于將Car
對(duì)象存儲(chǔ)到cars
Hashtable 中的對(duì)象相等,則可以使用其中一個(gè)來檢索另一個(gè)。
現(xiàn)在,這是什么意思...
等于的含義由 定義Object.equals(Object)
。如果不覆蓋此方法,則只有相同的對(duì)象才相等,即實(shí)例僅等于自身。在這種情況下,您不能使用不同的Person
對(duì)象。
您可能想要覆蓋equals
以檢查表示對(duì)象的值是否相等。這顯然假設(shè)您可以修改Person
類。
這是假設(shè)你正在談?wù)摰?strong>不同實(shí)例的同一類代表是同一個(gè)人,而不是不同的情況不同的類。
通常,equals
應(yīng)該只為同一類的對(duì)象返回 true (即使是子類也是一個(gè)問題)。因此,如果您的Person
對(duì)象屬于不同的類(更像是 aSalaryPerson
和CarPerson
)或者如果您無法更改它們,您可能需要實(shí)現(xiàn)一個(gè)PersonKey
類來提取與相等性(名稱,...)相關(guān)的數(shù)據(jù)并將其用作鍵.
使用整數(shù)作為鍵:
根據(jù)Integer 類的JavaDoc,Integer.equals(Integer)
如果兩個(gè)整數(shù)對(duì)象具有相同的int
值,則返回 true 。換句話說:Integer
用作 a 中的鍵Hashtable
將通過鍵的整數(shù)值檢索對(duì)象。
注意事項(xiàng):
Object.hashCode()
必須是一致的同equals
。簡而言之,如果您覆蓋equals
,您還必須覆蓋hashCode
并確保它為所有equals
認(rèn)為相等的對(duì)象返回相同的哈希碼。您必須確保 equal 使用的值在對(duì)象生命周期內(nèi)不會(huì)改變(或者至少只要它們作為 Hashtable 的鍵......) - 否則檢索將失敗!通常建議equals中使用的字段應(yīng)該是
final
順便一提:
根據(jù)Java 代碼約定,變量名以小寫字母開頭。因此,我將您的 Hashtables
salaries
和cars
.HashMap<K,V>
在 Java 中比Hashtable<K,V>
. 哈希表通常僅在需要同步實(shí)現(xiàn)時(shí)使用。
也可以看看:
Java Practices有一篇關(guān)于
equals
和 about的好文章hashCode
。有關(guān)詳細(xì)信息,
equals
請(qǐng)參閱Angelika Langer 的“平等的秘密()”Joshua Bloch 的“Effective Java”展示了 Java 的所有復(fù)雜部分

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超4個(gè)贊
這取決于不同的條件:
1) 如果第一個(gè) HashTable 的 keyset 中的 person 對(duì)象引用指向第二個(gè) HashTable 中的完全相同的對(duì)象,那么為 person 使用相同的汽車鍵就可以了。
2) 可能存在兩個(gè)人的名字和姓氏相同但對(duì)象不同的情況。在這種情況下,哈希值將不同,因此 HashTable 中的鍵。在這種情況下,您不能使用相同的密鑰。
如果您在 HashTable 中使用整數(shù)作為鍵,那么在您的場景中就可以了。
希望這會(huì)有所幫助。

TA貢獻(xiàn)1851條經(jīng)驗(yàn) 獲得超3個(gè)贊
使用Keys在Cars HashTable中查找對(duì)應(yīng)的車是否有效
當(dāng)然是啦
為了提供這種可能性,您應(yīng)該覆蓋您的hashCodeandequals方法并實(shí)現(xiàn)比較兩個(gè)值的方法 - 例如(假設(shè) 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();
}
然后,如果您看一下(1.8)的equals實(shí)現(xiàn),java.lang.Integer您會(huì)看到
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
public static int hashCode(int value) {
return value;
}
什么意味著這個(gè) Integer 類正在按值進(jìn)行比較 - 所以它會(huì)滿足您的要求
添加回答
舉報(bào)