Java 在hashmap中使用对象的实例作为键,然后使用新对象访问它?
我有一个带关键对象的hasmapJava 在hashmap中使用对象的实例作为键,然后使用新对象访问它?,java,hashmap,Java,Hashmap,我有一个带关键对象的hasmap HashMap<Key, Object> test; (不将该键存储在变量中) 所以。。过了一会儿。。。我想访问hashmap, 因为我没有对象,所以我尝试创建新的键(“相同”)并将其作为键。 但它不起作用 如何让它工作?(不保存变量中的第一个对象“键”) 所以,现在,我使用字符串对象作为键 HashMap<String, Object> HashMap 您需要在键上实现hashCode和equals。这些方法的作用只是检查实例是否相
HashMap<Key, Object> test;
(不将该键存储在变量中)
所以。。过了一会儿。。。我想访问hashmap,
因为我没有对象,所以我尝试创建新的键(“相同”)并将其作为键。
但它不起作用
如何让它工作?(不保存变量中的第一个对象“键”)
所以,现在,我使用字符串对象作为键
HashMap<String, Object>
HashMap
您需要在键上实现hashCode
和equals
。这些方法的作用只是检查实例是否相等(换句话说,两个Object
s只有在它们实际上是同一个对象时才会相等)
进一步阅读
当类不重写equals()
或hashCode()
方法时,将使用对象上的默认实现。特别是,equals()
只是检查引用的相等性
这立即解释了您的方法不起作用的原因:新的键
对象显然不是指旧的键
对象
如果希望能够指定具有相同属性的新实例,则应使用满足键相等条件的实现重写equals()
方法。您还应该重写hashCode()
,以完全控制键比较过程。您的问题可能是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();
}
及
应该有效很难知道你的问题是什么。你可能想考虑改写它…如果您只需要hashmap中的所有键,您可以使用方法keySet()
…不重复:另一个问题不直接处理映射,而是直接处理hashCode
和equals
,如果没有接受的答案,这两个问题可能看起来不相关。接受的答案足以理解这个问题。如果您在Eclipse中工作,只需右键单击并转到Source>Generate hashCode()和equals()…选择要包含在这些方法中的属性,代码将自动生成。节省时间!谢谢@ruhong,我用eclipse轻松生成了它们
@Override
public int hashCode()
{
return theStringValue.hashCode();
}
@Override
public boolean equals(Object o)
{
return this.theStringValue.equals(o);
}