java - equals() 方法的工作原理

标签 java equals

我正在深入研究 Java 的基础知识。我从 this article 推断,Java 的“等于”方法意味着,如果两个对象相等,则它们必须具有相同的 hashCode()。

这是我的例子。

public class Equals {

    /**
     * @param args
     */
    public static void main(String[] args) {
        String a = new String("a");
        String b = new String("a");
        System.out.println("a.hashCode() "+a.hashCode());
        System.out.println("b.hashCode() "+b.hashCode());
        System.out.println(a == b);
        System.out.println(a.equals(b));
    }

}

输出:

a.hashCode() 97
b.hashCode() 97
假的
是的

实际的 Java 语言“等于”方法:

  public boolean equals(Object obj) {
    return (this == obj);
  }

在我上面的例子中,a.equals(b) 返回了 true,这意味着满足条件 'a==b'。但是为什么在那个例子中 'a==b' 返回 false?

hashCode 和address 不是一回事吗?此外,当我们说“a==b”或其他内容时,是否会比较“hashCode”?

最佳答案

String 类覆盖了 equals() 方法。请关注String equals()文档。

a.equals(b) 已返回 true,意味着满足条件 a==b

这是 Object 类中 equals() 的默认实现,而 String 类已经覆盖了默认实现。当且仅当参数不为 null 并且是表示与此对象相同的字符序列的 String 对象时,它才返回 true。

hashCode 和地址不是一回事吗?

不一定。如需进一步阅读 hashCode() .

关于java - equals() 方法的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16089282/

相关文章:

java - 嵌套 <嵌套 :equal> and <nested:write> in combination

java - 使用数组列表提取数据时尝试在空对象引用上调用虚拟方法 'java.lang.String'

java - @事务回滚在 Spring Boot 应用程序中不起作用?

java - Hibernate:在子类中添加列

Java ArrayList不使用重写equals(Object o)方法进行比较

java - 如果我的类在 Java 中实现了可比性,我是否需要 equals 和 Hashcode 方法?

Java:强制组件填满 GridLayout 中的整行

java - Lucene 禁止了不应该出现的子句 "fuzzyfied"

java - 覆盖 java equals() 方法 - 不工作?

c# - Equals(item, null) 或 item == null