gpt4 book ai didi

java - equals() 和 hashCode() 的区别

转载 作者:搜寻专家 更新时间:2023-10-30 21:40:27 25 4
gpt4 key购买 nike

我想要一个关于 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());

最佳答案

equals()hashCode() 方法被证明是非常重要的,当实现这两个方法的对象被添加到集合中时。如果实现不当,可能会毁了你的生活。

equals() :此方法检查作为参数传递给它的某个其他对象是否等于调用此方法的对象。如果不理解契约,很容易错误地实现 equals() 方法。在覆盖此方法之前,需要牢记以下“属性”-

  • 自反的:o1.equals(o1) - 这意味着一个对象(例如 o1)应该等于它自己
  • 对称:o1.equals(o2) 当且仅当 o2.equals(o1)
  • 传递性:o1.equals(o2) && o2.equals(o3) 意味着 o1.equals(o3) 也是
  • 一致:只要 o1 和 o2 未被修改,o1.equals(o2) 就返回相同的值
  • null 比较:!o1.equals(null) - 这意味着任何可实例化对象都不等于 null。因此,如果您将 null 作为参数传递给对象 o1,那么它应该返回 false。
  • 哈希码值:o1.equals(o2) 意味着 o1.hashCode() == o2.hashCode() 。这个非常重要。如果定义 equals() 方法,则还必须定义 hashCode() 方法。这也意味着如果您有两个相等的对象,那么它们必须具有相同的 hashCode,但反之则不然

来自 java 源代码

*
* @param obj the reference object with which to compare.
* @return {@code true} if this object is the same as the obj
* argument; {@code false} otherwise.
* @see #hashCode()
* @see java.util.HashMap
*/
public boolean equals(Object obj) {
return (this == obj);

hashCode():此方法返回一个整数形式的 hashCode() 值,并支持基于哈希的 java.util.Collection 类(如 Hashtable、HashMap、HashSet 等)的好处。如果一个类重写了equals()方法,它也必须实现hashCode()方法。在重写这个方法之前,你需要记住

  • 每当在 Java 程序执行期间对同一对象多次调用 hashCode() 方法时,此方法必须一致地返回相同的结果。从程序的一次执行到同一程序的下一次执行,整数结果不需要保持一致。
  • 如果根据 equals() 方法,两个对象相等,则在这两个对象中的每一个中调用 hashCode() 方法都必须返回相同的整数结果。所以,如果一个字段没有在 equals() 中使用,那么它就不能在 hashCode() 方法中使用。

  • 如果两个对象根据 equals() 方法不相等,则两个对象中的每一个都可以返回两个不同的整数结果或相同的整数结果(即,如果 2 个对象具有相同的 hashCode() 结果并不意味着它们相等,但如果两个对象相等,则它们必须返回相同的 hashCode() 结果)。

根据 java 源代码就相当实际而言,java.lang.Object 定义的 hashCode 方法确实会为不同的对象返回不同的整数。 (这通常是通过将对象的内部地址转换为整数来实现的)

关于java - equals() 和 hashCode() 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24446763/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com