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")。
所以现在,我使用字符串对象作为键。
- 很难知道你的问题是什么。你可能想考虑重写它…如果您只需要哈希图中的所有键,可以使用方法keySet()…
- 需要以这样的方式设计键类:当使用equals()方法的对象相等时,它会为类似的字段值重新返回相同的哈希代码。一个好的hashmap密钥设计
- 不重复:另一个问题不直接处理地图,而是直接处理hashCode和equals,如果没有公认的答案,这些问题可能看起来不相关。接受的答案足以理解这个问题。
您需要在Key上实现hashCode和equals。这些方法的默认实现只检查例如是否相等(换句话说,只有当两个Object实际上是同一对象时,它们才相等)。
进一步阅读
对所有对象通用的有效Java方法
您的问题可能是Key没有正确地(或根本没有正确地)执行hashCode()和equals()。为了用作HashMap键,类必须实现这两个方法来反映两个对象的"相等性"。
如果创建两个不同的实例
并且期望它们是相等的,并且在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 );
} |
应该工作
- 如果您在Eclipse中工作,只需右键单击并转到源代码>生成hashcode()和equals()。选择要包含在这些方法中的属性,代码将自动生成。节省时间!
当类不重写equals()或hashCode()方法时,将使用Object类上的默认实现。特别是,equals()只是简单地检查参考等式。
这立刻解释了你的方法不起作用的原因:新的Key对象显然不是指旧的Key对象。
如果您希望能够使用相同的属性指定一个新实例,那么您应该使用一个满足您的键相等条件的实现来重写equals()方法。您还应该覆盖hashCode(),以完全控制关键比较过程。