📜  Java== 和 .equals() 方法的区别

📅  最后修改于: 2021-09-11 03:40:35             🧑  作者: Mango

通常, Java中的 equals() 和“==”运算符都用于比较对象以检查相等性,但以下是两者之间的一些区别:

  1. .equals() 方法和 ==运算符之间的主要区别在于,一个是方法,另一个是运算符。
  2. 我们可以使用 ==运算符进行引用比较(地址比较)和 .equals() 方法进行内容比较。简单来说, == 检查两个对象是否指向相同的内存位置,而 .equals() 评估对象中值的比较。
  3. 如果一个类没有覆盖 equals 方法,那么默认情况下它使用覆盖了这个方法的最近父类的 equals(Object o) 方法。详情请看这个
  4. 编码示例:
JAVA
// Java program to understand
// the concept of == operator
public class Test {
    public static void main(String[] args)
    {
        String s1 = "HELLO";
        String s2 = "HELLO";
        String s3 =  new String("HELLO");
        System.out.println(s1 == s2); // true
        System.out.println(s1 == s3); // false
        System.out.println(s1.equals(s2)); // true
        System.out.println(s1.equals(s3)); // true
    }
}


JAVA
// Java program to illustrate
// == operator for compatible data
// types
class Test {
    public static void main(String[] args)
    {
        // integer-type
        System.out.println(10 == 20);
 
        // char-type
        System.out.println('a' == 'b');
 
        // char and double type
        System.out.println('a' == 97.0);
 
        // boolean type
        System.out.println(true == true);
    }
}


JAVA
// Java program to illustrate
// == operator for incompatible data types
class Test {
    public static void main(String[] args)
    {
        Thread t = new Thread();
        Object o = new Object();
        String s = new String("GEEKS");
 
        System.out.println(t == o);
        System.out.println(o == s);
 
       // Uncomment to see error
       System.out.println(t==s);
    }
}


JAVA
public class Test {
    public static void main(String[] args)
    {
        Thread t1 = new Thread();
        Thread t2 = new Thread();
        Thread t3 = t1;
 
        String s1 = new String("GEEKS");
        String s2 = new String("GEEKS");
 
        System.out.println(t1 == t3);
        System.out.println(t1 == t2);
        System.out.println(s1 == s2);
 
        System.out.println(t1.equals(t2));
        System.out.println(s1.equals(s2));
    }
}


输出
true
false
true
true

说明:这里我们创建了两个对象,即 s1 和 s2。

  • s1 和 s2 都指代不同的对象。
  • 当我们使用 ==运算符进行 s1 和 s2 比较时,结果为真,因为两者在字符串常量池中具有相同的地址。
  • 使用 equals,结果为真,因为它只是比较 s1 和 s2 中给出的值。

Java字符串池

s1 = “HELLO”

s2 = “HELLO”

Java堆

s3 = “HELLO”

让我们详细了解这两个运算符:

相等运算符(==)

我们可以为包括布尔类型在内的每个原始类型应用相等运算符。我们还可以对对象类型应用相等运算符。

Java

// Java program to illustrate
// == operator for compatible data
// types
class Test {
    public static void main(String[] args)
    {
        // integer-type
        System.out.println(10 == 20);
 
        // char-type
        System.out.println('a' == 'b');
 
        // char and double type
        System.out.println('a' == 97.0);
 
        // boolean type
        System.out.println(true == true);
    }
}
输出
false
false
true
true

如果我们为对象类型应用 ==,那么参数类型之间应该有兼容性(子到父或父到子或相同类型)。否则,我们将得到编译时错误。

Java

// Java program to illustrate
// == operator for incompatible data types
class Test {
    public static void main(String[] args)
    {
        Thread t = new Thread();
        Object o = new Object();
        String s = new String("GEEKS");
 
        System.out.println(t == o);
        System.out.println(o == s);
 
       // Uncomment to see error
       System.out.println(t==s);
    }
}

输出:

false
false
// error: incomparable types: Thread and String

。等于()

在Java, 字符串 equals() 方法根据字符串的数据/内容比较两个给定的字符串。如果两个字符串的所有内容都相同,则返回 true。如果所有字符都不匹配,则返回 false。

Java

public class Test {
    public static void main(String[] args)
    {
        Thread t1 = new Thread();
        Thread t2 = new Thread();
        Thread t3 = t1;
 
        String s1 = new String("GEEKS");
        String s2 = new String("GEEKS");
 
        System.out.println(t1 == t3);
        System.out.println(t1 == t2);
        System.out.println(s1 == s2);
 
        System.out.println(t1.equals(t2));
        System.out.println(s1.equals(s2));
    }
}

输出:

true
false
false
false
true

说明:这里我们使用 .equals 方法来检查两个对象是否包含相同的数据。

  • 在上面的例子中,我们创建了 3 个 Thread 对象和 2 个 String 对象。
  • 在第一次比较中,我们正在检查 t1 == t3 与否。我们知道t1 和 t3 都指向同一个对象,这就是它返回 true 的原因。
  • 在第二个比较中,我们使用运算符“==”来比较字符串对象而不是对象的内容。在这里,两个对象不同,因此比较的结果是“假”
  • 当我们通过 .equals()运算符比较 2 个 String 对象时,我们正在检查两个对象是否包含相同的数据。
  • 这两个对象都包含相同的字符串,即 GEEKS,这就是它返回 true 的原因。