当前位置: 首页 > 知识库问答 >
问题:

重写hashcode和equals时要考虑的数据成员

程禄
2023-03-14

我知道(合同)当equals被重写时,我们需要重写hashcode。为什么我要考虑用于相等比较的相同字段来计算hashcode?是否通过避免太多对象映射到相同的桶来提高性能,如下面的情况?即所有在同一“日期”创建的对象都将映射到同一桶,并且线性比较将花费时间使用equals()方法检查对象是否存在?

如果我上面的说法是真的,那么除了性能问题之外,下面的代码还会出现哪些其他潜在的问题。这是我们应该使用equals中使用的相同字段/成员来计算hashcode的唯一原因吗?请分享。多谢了。

class MyClass {
  int date;
  int pay;
  int id;

  public boolean equals(Object o) {
    //null and same class instance check
    MyClass obj = (MyClass) o;
    return (date == obj.date && pay == obj.pay && id == obj.id);
  }

  public int hashCode() {
    int hash = 7;
    return (31 * hash + date);
  }
}

//请原谅语法错误,我没有使用IDE键入。

***我的意图是平等地使用所有字段,并且知道为什么在hashcode中应该使用相同数量的元素,以及如果只使用很少的元素会发生什么

澄清:只使用“date”来计算hashcode,指针检查正确的桶地址(你同意吗?)此外,我获得了该bucket中的项列表,集合将使用equals迭代检查特定的obj是否存在。我对等式的定义是“所有字段必须相同”。这样,我相信我的代码工作良好,我只发现性能问题。请指出我错在哪里。谢谢你

共有1个答案

章涵蓄
2023-03-14

对于您的示例,我建议您只使用id来表示相等,并注释它们是重写。此外,我喜欢重写toString()

@Override
public boolean equals(Object o) {
  if (o instanceof MyClass) {
    return (id == ((MyClass) o).id);
  }
  return false;
}

@Override
public int hashCode() {
  return id;
}

@Override
public String toString() {
  return String.format("MyClass (id=%d, date=%d, pay=%d)", id, date, pay);
}

这样,您就可以更新date和/或pay而不必重新创建哈希结构。而且,这也是实例的独特之处。

 类似资料:
  • 问题内容: 什么问题/陷阱,必须重写时,必须考虑和? 问题答案: 理论(针对语言律师和数学倾向者): 必须定义一个等价关系(它必须是自反的,对称的和可传递的)。另外,它必须是一致的(如果未修改对象,则它必须保持返回相同的值)。此外,必须始终返回。 也必须是一致的(如果未根据修改对象equals(),则它必须保持返回相同的值)。 该关系的两种方法之间是: 每当a.equals(b),则a.hashC

  • 本文向大家介绍hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?相关面试题,主要包含被问及hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?时的应答技巧和注意事项,需要的朋友参考一下 面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” ha

  • 本文向大家介绍java中重写equals()方法的同时要重写hashcode()方法(详解),包括了java中重写equals()方法的同时要重写hashcode()方法(详解)的使用技巧和注意事项,需要的朋友参考一下 object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 tr

  • 本文向大家介绍请你解释为什么重写equals还要重写hashcode?相关面试题,主要包含被问及请你解释为什么重写equals还要重写hashcode?时的应答技巧和注意事项,需要的朋友参考一下 考点:java基础 HashMap中,如果要比较key是否相等,要同时使用这两个函数!因为自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即便有相同含义

  • 问题内容: 关于如何考虑 超字段的 子类中的 Override &in,是否有特定规则?知道有很多参数:超字段是private / public,有/没有getter … 例如,Netbeans生成的equals()和hashCode()不会考虑超级字段…和 将返回true :( 如果要查看Netbeans生成的equals()和hashCode(): 问题答案: 儿童不应该检查父母的私人成员 但