在Java中,"=="运算符被用来比较两个对象的物理地址(或引用),而equals()方法则是用来比较两个对象的值。这并非equals()方法的全部用途,实际上,这个方法的作用通常会根据它在哪个类中实现而有所不同。
"=="运算符的详细讲解
在Java中,"=="这个运算符用来比较两个基本类型的数据或者两个引用类型对象的内存地址。通过以下程序我们可以深入理解:
public class EqualityTest { public static void main(String[] args) { String str1 = "Hello"; String str2 = "Hello"; String str3 = new String("Hello");
System.out.println(str1 == str2); // 输出:true
System.out.println(str1 == str3); // 输出:false
}
}
在上述程序中,str1和str2引用的是同一个对象,它们的内容和内存地址都相同,故str1 == str2 为 true。而str3是新创建的一个对象,即使其内容和str1、str2相同,其内存地址却与前两者不同,故str1 == str3 为 false。
equals()方法的详细讲解
下面,我们来看equals()方法。在Object类(即Java所有类的父类)中,该方法是用来比较两个对象引用是否指向同一个对象的。也就是说,在Object类中,equals()方法和"=="运算符几乎是一样的。
但是,许多Java类(例如String、Integer、Date等)都重写了这个方法,使得其可以根据类的实际需求比较两个对象的值。以String类为例——在该类中,equals()方法已经被重写,用来比较两个字符串中的字符是否完全相同。
public class EqualsMethod { public static void main(String[] args) { String str1 = "Hello"; String str2 = "Hello"; String str3 = new String("Hello");
System.out.println(str1.equals(str2)); // 输出:true
System.out.println(str1.equals(str3)); // 输出:true
}
}
在上述程序中,虽然str3引用的对象在不同的内存地址中,但在String类的equals()方法中,只要两个字符串中的字符完全相同,就认为两个字符串是相等的。因此,str1.equals(str2)和str1.equals(str3)都返回true。
"=="与equals()的关键异同点总结如下:
-
"=="是Java中的一个二元操作符,用于比较两个操作数的值,对于基本类型来说,"=="比较的是它们的值,对于引用类型,比较的是它们的内存地址。
-
equals()是Object类的一个方法,用于检查一个对象是否等于另一个对象。在Object类中,默认行为与"=="操作符相同,但许多类都重写了这个方法,根据类的实际需求比较两个对象的值。
-
"=="对于原始类型是比较值,而对于对象引用,比较的是指向的是否是同一个对象。
-
equals()的行为取决于它在哪个类中实现。例如,String类的equals()方法就比较两个字符串的内容,而不关注这两个字符串是否指向同一个对象。
通过以上对"=="运算符与equals()方法的深入剖析,我们应清楚地理解它们在两类情况下的使用——"=="运算符用于比较基本类型的值或者对象的物理地址,而equals()方法主要用于比较两个由同一个类创建的对象的值,so,前提在于正在比较的是什么,以便正确使用。