我想要一个关于 equals() 、“==” 和 hashCode() 的简要定义。如果我运行以下代码意味着输出将是“true false 2420395 2420395”。但我知道 equals() 方法比较字符串,而“==”比较引用。但是在输出中,hashCcode() 方法将两个字符串的引用号打印为相同,然后为什么“==”返回“false”。
String str = "Name";
String str1 = new String("Name");
if (str.equals(str1))
System.out.println("true");
else
System.out.println("false");
if (str == str1)
System.out.println("true");
else
System.out.println("false");
System.out.println(str.hashCode());
System.out.println(str1.hashCode());
原文由 Dhivakar 发布,翻译遵循 CC BY-SA 4.0 许可协议
当将实现这两种方法的对象添加到集合中时, equals() 和 hashCode() 方法被证明是非常重要的。如果实施不当,可能会毁了你的生活。
equals() :此方法检查作为参数传递给它的其他对象是否等于调用此方法的对象。如果不理解契约,很容易错误地实现 equals() 方法。在覆盖此方法之前,需要牢记以下“属性”-
来自java源代码
}
hashCode() :此方法返回一个 hashCode() 值作为 Integer 并支持基于哈希的 java.util.Collection 类(如 Hashtable、HashMap、HashSet 等)的好处。如果一个类覆盖 equals() 方法,它必须也实现 hashCode() 方法。在覆盖此方法之前,您需要牢记
每当在 Java 程序执行期间对同一对象多次调用 hashCode() 方法时,此方法必须一致地返回相同的结果。从程序的一次执行到同一程序的下一次执行,整数结果不需要保持一致。
如果根据 equals() 方法两个对象相等,则在这两个对象中的每一个中调用 hashCode() 方法都必须返回相同的整数结果。所以,如果一个字段没有在 equals() 中使用,那么它就不能在 hashCode() 方法中使用。
如果根据 equals() 方法两个对象不相等,则两个对象中的每一个都可以返回两个不同的整数结果或相同的整数结果(即,如果 2 个对象具有相同的 hashCode() 结果并不意味着它们相等,但是如果两个对象相等,则它们必须返回相同的 hashCode() 结果)。
根据 java 源代码 尽可能多的合理实用,由 java.lang.Object 定义的 hashCode 方法确实为不同的对象返回不同的整数。 (这通常是通过将对象的内部地址转换为整数来实现的)