java - 如何确保 hashCode() 与 equals() 一致?

标签 java object equals hashcode

当覆盖 java.lang.Object 的 equals() 函数时,javadocs 建议,

it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.

hashCode() 方法必须为每个对象返回一个唯一整数(这在根据内存位置比较对象时很容易做到,只需返回唯一整数地址对象)

应该如何重写 hashCode() 方法,以便它仅根据对象的属性为每个对象返回一个唯一整数


public class People{
   public String name;
   public int age;

   public int hashCode(){
      // How to get a unique integer based on name and age?
   }
}
/*******************************/
public class App{
   public static void main( String args[] ){
       People mike = new People();
       People melissa = new People();
       mike.name = "mike";
       mike.age = 23;
       melissa.name = "melissa";
       melissa.age = 24;
       System.out.println( mike.hasCode() );  // output?
       System.out.println( melissa.hashCode(); // output?
   }
}

最佳答案

并不是说一个对象的哈希码必须是完全唯一的,只是说两个相等对象的哈希码返回相同的哈希码。让两个不相等的对象返回相同的哈希码是完全合法的。但是,哈希码分布在一组对象上的唯一性越高,您从 HashMap 和其他使用哈希码的操作中获得的性能就越好。

诸如 IntelliJ Idea 之类的 IDE 具有内置的 equals 和 hashCode 生成器,通常可以很好地为大多数对象提供“足够好”的代码(并且可能比一些手工制作的过于聪明的哈希函数更好)。

例如,这是 Idea 为您的 People 类生成的 hashCode 函数:

public int hashCode() {
    int result = name != null ? name.hashCode() : 0;
    result = 31 * result + age;
    return result;
}

关于java - 如何确保 hashCode() 与 equals() 一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/410236/

相关文章:

java - 如果所需长度不够长,如何用空格填充字符串?

Windows 10 移动版上的 Java

Java 字符串比较

java - 如何让中文语言环境以中文显示为特别简体或繁体

java - 如何使用 Tomcat 8.0 从 WSDL 生成 Java 客户端? WSDL 文件有多个 xsd 导入

javascript - 带有 JavaScript 日期对象的下拉菜单?

android - 将对象放入包中

javascript - var myFunc = new Object(function myFunc () {}) 和 function myFunc () {} 有什么区别?

java - 哈希集如何检查重复元素?

java - 为什么 Object.equals() 的实现没有使用 hashCode()?