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

Kee*_*bze 38 java hashmap

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

HashMap<Key, Object> test;
Run Code Online (Sandbox Code Playgroud)

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

它就像...:

test.put(new Key("the same"), someObject);
Run Code Online (Sandbox Code Playgroud)

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

所以..过了一段时间...我想访问hashmap,因为我没有对象,我试图创建新的Key("相同")并将其作为密钥.但它没有用.

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

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

HashMap<String, Object>
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 64

你需要实现hashCodeequals开启Key.这些方法的默认实现只是检查实例是否相等(换句话说,Object如果它们实际上是同一个对象,则两个s只会相等).

进一步阅读

有效的Java - 所有对象共有的方法


Jim*_*son 33

你的问题很可能是Key没有实施hashCode()equals()正确(或全部).为了用作HashMap键,类必须实现这两个方法以反映两个对象的"相等性".

如果您创建两个不同的实例

Key a = new Key("xyz");
Key b = new Key("xyz");
Run Code Online (Sandbox Code Playgroud)

并且期望它们相等并且在a中工作HashMap,你必须覆盖hashCode()它以便它在两个实例中返回相同的值,并equals()在比较它们时返回true.

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

@Override
public int hashCode()
{
    return theStringValue.hashCode();
}
Run Code Online (Sandbox Code Playgroud)

@Override
public boolean equals(Object o)
{
    return this.theStringValue.equals(o);
}
Run Code Online (Sandbox Code Playgroud)

应该管用

  • 如果您在Eclipse中工作,只需右键单击并转到Source> Generate hashCode()和equals()...选择要包含在这些方法中的属性,代码将自动生成.节省时间! (11认同)

dle*_*lev 6

当类不重写equals()hashCode()方法时,将Object使用在类上找到的默认实现.特别是,equals()只需检查参考相等性.

这立即解释了为什么你的方法不起作用:新Key对象显然不是指旧Key对象.

如果您希望能够指定具有相同属性的新实例,则应equals()使用满足密钥相等标准的实现覆盖该方法.您也应该覆盖hashCode(),以完全控制密钥比较过程.