协慌网

登录 贡献 社区

Java 中 == 和 equals()有什么区别?

我想澄清一下我是否正确理解了这一点:

  • ==是参考比较,即两个对象都指向相同的存储位置
  • .equals()计算对象中值的比较

答案

通常,您的问题的答案是 “是”,但是...

  • .equals(...)将只比较它要比较的内容,不会多也不会少。
  • 如果一个类没有覆盖 equals 方法,则默认为覆盖了该方法的最接近的父类equals(Object o)
  • 如果没有父类提供重写,则它将默认使用最终父类 Object 中的方法,因此将剩下Object#equals(Object o)方法。根据对象 API,这与==相同;也就是说,当且仅当两个变量都引用相同的对象(如果它们的引用是相同的)时,它才返回 true。因此,您将测试对象相等性而不是功能相等性
  • 如果您重写equals ,请始终记住重写hashCode ,以免 “违反合同”。根据 API,如果两个对象equals方法显示等效hashCode()方法返回的结果必须相同。反过来未必是真实的。

关于 String 类:

equals()方法比较 String 实例内部(在堆上)的 “值”,而不管两个对象引用是否引用相同的 String 实例。如果任何两个 String 类型的对象引用都引用同一个 String 实例,那就太好了!如果两个对象引用引用了两个不同的 String 实例,则没有任何区别。它是被比较的每个 String 实例中的 “值”(即:字符数组的内容)。

另一方面,“==”运算符比较两个对象引用的值,以查看它们是否引用相同的String 实例。如果两个对象的值均引用 “引用” 相同的 String 实例,则布尔表达式的结果将为 “true” .. duh。另一方面,如果两个对象引用的值 “引用”不同的 String 实例(即使两个 String 实例都具有相同的 “值”,即每个 String 实例的字符数组的内容相同),则布尔表达式的结果将为 “false”。

与任何解释一样,让它沉入。

我希望这可以使事情变得简单。

根据您是在谈论 “原始” 还是 “对象类型”,有一些细微的差异。如果您谈论的是 “静态” 或“非静态” 成员,也可以这样说;您也可以混合以上所有内容...

这是一个示例(您可以运行它):

public final class MyEqualityTest
{
    public static void main( String args[] )
    {
        String s1 = new String( "Test" );
        String s2 = new String( "Test" );

        System.out.println( "\n1 - PRIMITIVES ");
        System.out.println( s1 == s2 ); // false
        System.out.println( s1.equals( s2 )); // true

        A a1 = new A();
        A a2 = new A();

        System.out.println( "\n2 - OBJECT TYPES / STATIC VARIABLE" );
        System.out.println( a1 == a2 ); // false
        System.out.println( a1.s == a2.s ); // true
        System.out.println( a1.s.equals( a2.s ) ); // true

        B b1 = new B();
        B b2 = new B();

        System.out.println( "\n3 - OBJECT TYPES / NON-STATIC VARIABLE" );
        System.out.println( b1 == b2 ); // false
        System.out.println( b1.getS() == b2.getS() ); // false
        System.out.println( b1.getS().equals( b2.getS() ) ); // true
    }
}

final class A
{
    // static
    public static String s;
    A()
    {
        this.s = new String( "aTest" );
    }
}

final class B
{
    private String s;
    B()
    {
        this.s = new String( "aTest" );
    }

    public String getS()
    {
        return s;
    }

}

您可以通过以下链接比较 “==“(相等运算符)和 “ .equals(...)”(java.lang.Object 类中的方法)的解释: