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

Using an instance of an object as a key in hashmap, and then access it with exactly new object?

本问题已经有最佳答案,请猛点这里访问。

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

1
HashMap<Key, Object> test;

并将新密钥("相同")作为密钥。

所以就像……:

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

(不将该键存储在变量中)

所以…过了一会儿…我想访问hashmap,因为我没有对象,所以我尝试制作新的密钥("相同")并将其作为密钥。但它不起作用。

如何使其工作?(不保存变量中的第一个对象"key")。

所以现在,我使用字符串对象作为键。

1
HashMap<String, Object>


您需要在Key上实现hashCodeequals。这些方法的默认实现只检查例如是否相等(换句话说,只有当两个Object实际上是同一对象时,它们才相等)。

进一步阅读

对所有对象通用的有效Java方法


您的问题可能是Key没有正确地(或根本没有正确地)执行hashCode()equals()。为了用作HashMap键,类必须实现这两个方法来反映两个对象的"相等性"。

如果创建两个不同的实例

1
2
Key a = new Key("xyz");
Key b = new Key("xyz");

并且期望它们是相等的,并且在HashMap中工作,您必须重写hashCode()以便它在两种情况下返回相同的值,并且在比较它们时equals()返回真值。

如果对象标识基于字符串值,则

1
2
3
4
5
@Override
public int hashCode()
{
    return theStringValue.hashCode();
}

1
2
3
4
5
@Override
public boolean equals(Object o)
{
    return this.theStringValue.equals(o);
}

应该工作


当类不重写equals()hashCode()方法时,将使用Object类上的默认实现。特别是,equals()只是简单地检查参考等式。

这立刻解释了你的方法不起作用的原因:新的Key对象显然不是指旧的Key对象。

如果您希望能够使用相同的属性指定一个新实例,那么您应该使用一个满足您的键相等条件的实现来重写equals()方法。您还应该覆盖hashCode(),以完全控制关键比较过程。