3 回答
TA贡献1859条经验 获得超6个赞
简短的回答:
如果Person
用于将Salary
对象存储到salaries
Hashtable 中的Person
对象与用于将Car
对象存储到cars
Hashtable 中的对象相等,则可以使用其中一个来检索另一个。
现在,这是什么意思...
等于的含义由 定义Object.equals(Object)
。如果不覆盖此方法,则只有相同的对象才相等,即实例仅等于自身。在这种情况下,您不能使用不同的Person
对象。
您可能想要覆盖equals
以检查表示对象的值是否相等。这显然假设您可以修改Person
类。
这是假设你正在谈论的不同实例的同一类代表是同一个人,而不是不同的情况不同的类。
通常,equals
应该只为同一类的对象返回 true (即使是子类也是一个问题)。因此,如果您的Person
对象属于不同的类(更像是 aSalaryPerson
和CarPerson
)或者如果您无法更改它们,您可能需要实现一个PersonKey
类来提取与相等性(名称,...)相关的数据并将其用作键.
使用整数作为键:
根据Integer 类的JavaDoc,Integer.equals(Integer)
如果两个整数对象具有相同的int
值,则返回 true 。换句话说:Integer
用作 a 中的键Hashtable
将通过键的整数值检索对象。
注意事项:
Object.hashCode()
必须是一致的同equals
。简而言之,如果您覆盖equals
,您还必须覆盖hashCode
并确保它为所有equals
认为相等的对象返回相同的哈希码。您必须确保 equal 使用的值在对象生命周期内不会改变(或者至少只要它们作为 Hashtable 的键......) - 否则检索将失败!通常建议equals中使用的字段应该是
final
顺便一提:
根据Java 代码约定,变量名以小写字母开头。因此,我将您的 Hashtables
salaries
和cars
.HashMap<K,V>
在 Java 中比Hashtable<K,V>
. 哈希表通常仅在需要同步实现时使用。
也可以看看:
Java Practices有一篇关于
equals
和 about的好文章hashCode
。有关详细信息,
equals
请参阅Angelika Langer 的“平等的秘密()”Joshua Bloch 的“Effective Java”展示了 Java 的所有复杂部分
TA贡献1836条经验 获得超4个赞
这取决于不同的条件:
1) 如果第一个 HashTable 的 keyset 中的 person 对象引用指向第二个 HashTable 中的完全相同的对象,那么为 person 使用相同的汽车键就可以了。
2) 可能存在两个人的名字和姓氏相同但对象不同的情况。在这种情况下,哈希值将不同,因此 HashTable 中的键。在这种情况下,您不能使用相同的密钥。
如果您在 HashTable 中使用整数作为键,那么在您的场景中就可以了。
希望这会有所帮助。
TA贡献1851条经验 获得超3个赞
使用Keys在Cars HashTable中查找对应的车是否有效
当然是啦
为了提供这种可能性,您应该覆盖您的hashCodeandequals方法并实现比较两个值的方法 - 例如(假设 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实现,java.lang.Integer您会看到
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 类正在按值进行比较 - 所以它会满足您的要求
添加回答
举报