Java Object類的equals()方法


所有類都從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。

 

wx搜索“程序員考拉”,專注java領域,一個伴你成長的公眾號!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM