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

使用重写的equals重写hashCode使用equalsIgnoreCase检查相等性

史弘致
2023-03-14
@Override
public boolean equals(Object o) {
    if (o == this) return true;
    if (! (o instanceof Player)) return false;
    Player p = (Player) o;
    return getFirstName().equalsIgnoreCase(p.getFirstName()) && 
            getLastName().equalsIgnoreCase(p.getLastName());
}
@Override
public int hashCode() {
    int result = 17;
    result = 31 * result + getFirstName().toLowerCase().hashCode();
    result = 31 * result + getLastName().toLowerCase().hashCode();
    return result;
}

我的问题是关于我被重写的hashCode()方法。我知道,如果equals(Object)方法认为两个对象相等,我需要hashCode()为它们返回相同的值。我的直觉告诉我,在某些情况下,这个hashCode()会违反合同。

有没有一种可接受的方法可以在一个重写的equals(Object)方法中使用equalsIgnoreCase(String)方法,并生成一个不违反约定的hashcode?

共有1个答案

何甫
2023-03-14
@Override
public int hashCode() {
    int result = 17;
    result = 31 * result + characterwiseCaseNormalize(getFirstName()).hashCode();
    result = 31 * result + characterwiseCaseNormalize(getLastName()).hashCode();
    return result;
}

private static String characterwiseCaseNormalize(String s) {
    StringBuilder sb = new StringBuilder(s);
    for(int i = 0; i < sb.length(); i++) {
        sb.setCharAt(i,Character.toLowerCase(Character.toUpperCase(sb.charAt(i))));
    }
    return sb.toString();
}

hashcode将与使用equalsignorecase定义的equals一致。原则上,根据equalsignorecase的契约,这似乎依赖于

Character.toLowerCase(Character.toUpperCase(c1))==Character.toLowerCase(Character.toUpperCase(c2))

无论何时

Character.toLowerCase(c1)==Character.toLowerCase(c2).  

我没有证据证明这是正确的,但是equalsIgnoreCase的OpenJDK实现实际上与此方法保持一致;它检查相应的字符是否相等,然后检查它们的大写版本是否相等,然后检查大写版本的小写版本是否相等。

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

  • 这是来自与hashCode一起使用的旧版本代码并等于,但我正在尝试让新版本使用它。我认为原因是因为在旧版本中我覆盖了 equals 和 hashCode,但在新版本中我似乎无法做到这一点,因为我不再比较对象,而是比较数组(这是猜测)。因此,当前版本不会拾取重复项。它说没有重复项,但这是不正确的。 以下是检测重复项的旧版本的哈希代码和等于。 这是当前版本。 在搜索方法中是确定重复项的地方。这是旧的代

  • 问题内容: 有没有办法找出一个类是否已重写和? 问题答案: 您可以使用反射 如果将注释掉,如果没有注释,将打印。 将返回实现该对象的类的对象。 请注意 ,仅适用于方法。但是,在这种情况下,和必须。取决于其他算法,该算法将需要更改。

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

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

  • 本文向大家介绍java中为何重写equals时必须重写hashCode方法详解,包括了java中为何重写equals时必须重写hashCode方法详解的使用技巧和注意事项,需要的朋友参考一下 前言 大家都知道,equals和hashcode是java.lang.Object类的两个重要的方法,在实际应用中常常需要重写这两个方法,但至于为什么重写这两个方法很多人都搞不明白。 在上一篇博文Java中e