我有一个带有关键对象的hasmap,
HashMap<Key, Object> test;
并将新密钥(“相同”)设为密钥..
所以就像...:
test.put(new Key("the same"), someObject);
(不将该密钥存储在变量中)
所以...过了一会儿...我想访问hashmap, 因为我没有这个对象,所以我试图制作新的Key(“相同”)并将其作为一个键。 但它没有用。
如何让它发挥作用? (不保存变量中的第一个对象“key”)
所以同时,现在,我使用String对象作为键。
HashMap<String, Object>
答案 0 :(得分:62)
您需要在hashCode
上实施equals
和Key
。这些方法的default implementation只检查 instance 的相等性(换句话说,如果它们实际上是同一个对象,则两个Object
只会相等。)
答案 1 :(得分:29)
您的问题很可能是Key
未正确实施hashCode()
和equals()
(或根本没有)。为了用作HashMap
键,类必须实现这两个方法以反映两个对象的“相等性”。
如果使用
创建两个不同的实例Key a = new Key("xyz");
Key b = new Key("xyz");
并期望它们相等并且在HashMap
中工作,您必须覆盖hashCode()
以便它在两个实例中返回相同的值,并且equals()
在比较它们时返回true
如果对象标识基于字符串值,则
@Override
public int hashCode()
{
return theStringValue.hashCode();
}
和
@Override
public boolean equals(Object o)
{
return this.theStringValue.equals(o);
}
应该有效
答案 2 :(得分:6)
当一个类没有覆盖equals()
或hashCode()
方法时,会使用Object
类中的默认实现。特别是,equals()
只是检查引用相等性。
这立即解释了为什么您的方法不起作用:新的Key
对象显然不是指旧的Key
对象。
如果您希望能够指定具有相同属性的新实例,则应该使用符合密钥相等标准的实现覆盖equals()
方法。您也应该覆盖hashCode()
,以完全控制密钥比较过程。