Java中==和 .equals()方法的区别
equals()
方法和 ==
运算符都用于比较 Java 中的两个对象。 ==
是运算符, equals()
是方法。 但是 ==
运算符比较堆中对象的引用或内存位置,无论它们是否指向相同的位置。
每当使用操作符 new
创建一个对象时,它都会为该对象创建一个新的内存位置。 所以使用 ==
运算符来检查两个对象的内存位置或地址是否相同。
通常,Java 中的 equals()
和 ==
运算符都用于比较对象以检查相等性,但以下是两者之间的一些区别:
.equals()
方法和==
运算符的主要区别在于,一个是方法,另一个是运算符。- 可以使用
==
操作符进行引用比较(地址比较)和.equals()
方法进行内容比较。 简单来说,==
检查两个对象是否指向相同的内存位置,而.equals()
评估对象中值的比较。 - 如果一个类没有覆盖
equals
方法,那么默认情况下,它会使用覆盖该方法的最近父类的equals(Object o)
方法。
// 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
}
}
运行结果:
true
false
true
true
说明:在这里,创建了两个对象,即 s1
和 s2
。
s1
和s2
都引用相同的对象。- 当使用
==
运算符进行s1
和s2
比较时,结果为true
,因为两者在字符串常量池中具有相同的地址。 - 使用
equals
,结果为true
,因为它只比较s1
和s2
中给出的值。
等式运算符(==)
可以对每个原始类型应用相等运算符,包括布尔类型。还可以对对象类型应用相等运算符。
// 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 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("geekdocs");
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
.equals() 方法
在 Java 中,String equals() 方法根据字符串的数据/内容比较两个给定的字符串。 如果两个字符串的所有内容都相同,则返回 true
。 如果所有字符都不匹配,则返回 false
。
示例代码:
public class Test {
public static void main(String[] args)
{
Thread t1 = new Thread();
Thread t2 = new Thread();
Thread t3 = t1;
String s1 = new String("geekdocs");
String s2 = new String("geekdocs");
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
。 - 在第二个比较中,使用运算符
==
来比较字符串对象而不是对象的内容。 在这里,两个对象都是不同的,因此这个比较的结果是false
。 - 当通过
.equals()
运算符比较 2 个 String 对象时,正在检查两个对象是否包含相同的数据。 - 两个对象都包含相同的字符串,即 geekdocs,它返回
true
。