1. 程式人生 > >Java Object類的equals()方法

Java Object類的equals()方法

幫助 ati pac obj nbsp 就是 pre 如果 是否

所有類都從Object類中繼承了equals方法,Object類中equals方法源代碼如下:

public boolean equals(Object obj)  
{
return this == obj;
}

Object中的equals方法是直接判斷this和obj本身的值是否相等,即用來判斷調用equals的對象和形參obj所引用的對象是否是同一對象,所謂同一對象就是指內存中同一塊存儲單元,如果this和obj指向的是同一塊內存對象,則返回true,如果this和obj指向的不是同一塊內存,則返回false,註意:即便是內容完全相等的兩塊不同的內存對象,也返回false。

那麽equals()方法與之前的“==”有什麽區別呢?

在進行演示代碼之前先來了解一下Java內存的主要劃分,可以幫助我們更好地理解下面的實例演示。

技術分享圖片

Java虛擬機裏的堆區要存放new出來的對象,棧區存放局部變量,而方法區包含了類的所有信息,包括所有的方法,靜態變量,常量等。

通過以下實例我們來加深一下equals與,代碼如下:

public class Equals{
public static void main(String[] args){
String s1="apple";
String s2="apple";
System.out.println(s1==s2); //true
System.out.println(s1.equals(s2)); //equals比較的是內容,true
String s3=new String("apple");
String s4=new String("apple");
System.out.println(s3==s4); //false
System.out.println(s3.equals(s4)); //true
}
}

從上面的實例可以看出,“==”比較的是兩個引用的對象是否相等,而equals()方法比較的是兩個對象的實際內容。我們結合上面的內存的劃分來理解這個區別。

String str1=new String("apple");
String str2=new String("apple");
System.out.println(s3==s4); //false
System.out.println(s3.equals(s4)); //true

上述幾行代碼內存分析如下圖所示:

技術分享圖片

因為“==”比較的是兩個引用的對象是否相等,從上圖很容易看出來不等,所以System.out.println(s3==s4),結果為False;而equals()方法比較的是兩個對象的實際內容,從圖中可以看出s3和s4都指向apple,內容是相同的,所以System.out.println(s3.equals(s4)),結果為True。

再來看

String s1="apple";
String s2="apple";

內存分析如下圖:

技術分享圖片

很容易看出System.out.println(s1==s2)的結果為True。

Java Object類的equals()方法