Java中使用==和.equals()方法比较String的区别
equals()方法和==操作符都用于比较Java中的两个对象。==是一个操作符,而equals()是方法。但是==运算符比较堆中对象的引用或内存位置,无论它们是否指向相同的位置。
每当使用new操作符创建对象时,它都会为该对象创建一个新的内存位置。因此,我们使用==操作符来检查两个对象的内存位置或地址是否相同。
一般来说,在Java中equals()和” == “操作符都是用来比较对象来检查是否相等的,但以下是两者之间的一些区别:
- .equals()方法和==操作符之间的主要区别在于,一个是方法,另一个是操作符。
- 可以使用==操作符进行引用比较(地址比较),使用.equals()方法进行内容比较。简单地说,==检查两个对象是否指向相同的内存位置,而.equals()计算的是对象中值的比较。
- 如果一个类没有覆盖equals方法,那么默认情况下,它使用覆盖该方法的最近父类的equals(Object o)方法。参见为什么覆盖等于(对象)和hashCode()方法?在细节。
// 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使用==操作符进行比较时,结果为真,因为两者在字符串常量池中具有相同的地址。
- 使用equals,结果为真,因为它只比较s1和s2中给出的值。
Java String Pool
s1 = “HELLO”
s2 = “HELLO”
Java Heap
s3 = “HELLO”
让我们来详细了解一下这两种操作符:
相等操作符(= =)
可以对每一种基本类型应用相等操作符,包括布尔类型。我们还可以对对象类型应用相等操作符。
// 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("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
.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("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的原因。
- 在第二次比较中,我们使用运算符“==”来比较String对象,而不是对象的内容。在这里,两个对象是不同的,因此这个比较的结果是“False”。
- 当我们通过.equals()操作符比较两个String对象时,我们要检查两个对象是否包含相同的数据。
- 两个对象都包含相同的String, i.e。极客。这就是它返回true的原因。