【问题标题】:Using an instance of an object as a key in hashmap, and then access it with exactly new object? [duplicate]使用对象的实例作为 hashmap 中的键,然后使用全新的对象访问它? [复制]
【发布时间】:2012-03-15 11:19:06
【问题描述】:

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

HashMap<Key, Object> test;

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

所以它就像..:

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

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

所以.. 过了一会儿...我想访问哈希图, 因为我没有对象,所以我尝试制作 new Key("the same") 并将其作为键。 但是没用。

如何让它发挥作用? (不将第一个对象“键”保存在变量中)

因此,目前,我使用 String 对象作为键。

HashMap<String, Object>

【问题讨论】:

  • 很难知道你的问题在问什么。您可能需要考虑重写它...如果您只想要哈希图中的所有键,您可以使用方法keySet()...
  • 不重复:另一个问题不直接涉及地图,而是直接涉及hashCodeequals,如果没有接受的答案,这似乎无关。接受的答案足以理解问题。

标签: java hashmap


【解决方案1】:

您需要在Key 上实现hashCodeequals。这些方法中的default implementation 只是检查instance 是否相等(换句话说,两个Objects 只有当它们实际上是同一个对象时才会相等)。

进一步阅读

Effective Java - Methods common to all objects

【讨论】:

    【解决方案2】:

    您的问题可能是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();
    }
    

    @Override
    public boolean equals(Object o)
    {
        return this.theStringValue.equals(o);
    }
    

    应该有效

    【讨论】:

    • 如果您在 Eclipse 中工作,只需右键单击并转到 Source>Generate hashCode() 和 equals()... 选择要包含在这些方法中的属性,代码将自动生成.节省时间!
    • 感谢@ruhong 我用 eclipse 轻松生成了它们
    • 如果您使用的是 Lombok,它会为您生成带有 @EqualsAndHasCode 注释的样板文件
    【解决方案3】:

    当一个类没有覆盖equals()hashCode() 方法时,将使用Object 类上的默认实现。特别是,equals() 只是检查引用是否相等。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多