【问题标题】:Using an object's instance as a HashMap key使用对象的实例作为 HashMap 键
【发布时间】:2017-03-11 14:24:15
【问题描述】:

我发现了类似的问题,但到目前为止都没有真正帮助我(这可能意味着我做错了什么,这就是我在这里的原因)。

我有一个 HashMap Map<Integer, List<Book>> 应该有一个 StudentID 作为键和他拥有的 Book 列表作为值。虽然只传递ID 作为密钥有效,但我觉得它不是一种足够面向对象的方法,我应该使用Student 作为密钥(所以它看起来像这样:Map<Student, List<Book>>)。我尝试使用它,但是当我尝试返回给定的StudentBook 列表时出现了一堆错误,很可能是因为找不到Student。我的教授建议我使用 @Override Java 的 hashCodeequals 方法,这是有道理的,因为这就是 HashMap 比较键的方式,但我在这方面没有成功(我不确定我到底需要什么比较以查看两个Student 是否相同;据说,它们的ID 单独应该可以工作)。以下是被覆盖的方法:

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + id;
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Student other = (Student) obj;
    if (id != other.id)
        return false;
    return true;
}

我做错了什么?您可以对此有所了解的任何信息都将非常有帮助。提前致谢!

【问题讨论】:

  • 错误在别处。发布一个完整的最小示例来重现问题。
  • if (id != other.id) return false; return true; 为什么你更喜欢这个而不是return id.equals(other.id);

标签: java hashmap equals hashcode


【解决方案1】:

错误似乎在您的 equals 方法中,前提是您的 id 的值超出整数缓存范围,即 -128 - 127

 if (id != other.id) // <-- Error
        return false;

从您的示例中,id 似乎是一个 Integer 对象

== 检查引用是否相等,即它们是否指向同一个对象。

对于原始类型,== 检查值是否相等。

java.lang.Integer 是一个引用类型。 int 是原始类型。

虽然在整数的情况下,== 仅适用于 -128 之间的数字 和 127 作为 JVM 缓存这些值

你需要改成

if (!id.equals(other.id))
            return false;

【讨论】:

  • 可能,但由于那些看起来像自动生成的方法,我猜想 id 是一个原语。
  • 由于 OP 使用 Integer 作为地图中的键,让我相信 id 是一个 Integer 实例
  • if (!id.equals(other.id)) return false; 为什么你更喜欢这个而不是return id.equals(other.id);
  • @LewBloch 现在可以很好地工作,但是一旦您在 equals 方法中添加更多字段进行比较,您将不得不更改语句 return id.equals(other.id);否则剩余的比较语句将不会被执行。因此,从代码可扩展性的角度来看,正确的形式更好
  • 这里不是这样,但是假设我们使用三个名称部分而不是非面向对象的id,我们可以只使用:boolean is = first.equals(other.first) &amp;&amp; second.equals(other.second) &amp;&amp; third.equals(other.third);。我同意有时if 链更好,但很少有值类型的相等比较涉及三个以上的字段。
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
相关资源
最近更新 更多