我有一个带有关键对象的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)
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)
应该管用
当类不重写equals()
或hashCode()
方法时,将Object
使用在类上找到的默认实现.特别是,equals()
只需检查参考相等性.
这立即解释了为什么你的方法不起作用:新Key
对象显然不是指旧Key
对象.
如果您希望能够指定具有相同属性的新实例,则应equals()
使用满足密钥相等标准的实现覆盖该方法.您也应该覆盖hashCode()
,以完全控制密钥比较过程.
归档时间: |
|
查看次数: |
108781 次 |
最近记录: |