使用对象的实例作为hashmap中的键,然后使用完全新的对象访问它?

时间:2012-02-25 01:44:38

标签: java hashmap

我有一个带有关键对象的hasmap,

HashMap<Key, Object> test;

并将新密钥(“相同”)设为密钥..

所以就像...:

test.put(new Key("the same"), someObject);

(不将该密钥存储在变量中)

所以...过了一会儿...我想访问hashmap, 因为我没有这个对象,所以我试图制作新的Key(“相同”)并将其作为一个键。 但它没有用。

如何让它发挥作用? (不保存变量中的第一个对象“key”)

所以同时,现在,我使用String对象作为键。

HashMap<String, Object>

3 个答案:

答案 0 :(得分:62)

您需要在hashCode上实施equalsKey。这些方法的default implementation只检查 instance 的相等性(换句话说,如果它们实际上是同一个对象,则两个Object只会相等。)

进一步阅读

Effective Java - Methods common to all objects

答案 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(),以完全控制密钥比较过程。