所有類都從Object類中繼承了equals方法,Object類中equals方法源代碼如下:
public?boolean?equals(Object?obj) ?
? ?{ ?
? ? ? ?return?this?== obj; ?
? ?}
Object中的equals方法是直接判斷this和obj本身的值是否相等,即用來判斷調(diào)用equals的對象和形參obj所引用的對象是否是同一對象,所謂同一對象就是指內(nèi)存中同一塊存儲單元,如果this和obj指向的是同一塊內(nèi)存對象,則返回true,如果this和obj指向的不是同一塊內(nèi)存,則返回false,注意:即便是內(nèi)容完全相等的兩塊不同的內(nèi)存對象,也返回false。
那么equals()方法與之前的“==”有什么區(qū)別呢?
在進(jìn)行演示代碼之前先來了解一下Java內(nèi)存的主要劃分,可以幫助我們更好地理解下面的實(shí)例演示。
?
Java虛擬機(jī)里的堆區(qū)要存放new出來的對象,棧區(qū)存放局部變量,而方法區(qū)包含了類的所有信息,包括所有的方法,靜態(tài)變量,常量等。
通過以下實(shí)例我們來加深一下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比較的是內(nèi)容,true
String s3=new?String("apple");
String s4=new?String("apple");
System.out.println(s3==s4); ?//false
System.out.println(s3.equals(s4)); ?//true
}
}
從上面的實(shí)例可以看出,“==”比較的是兩個(gè)引用的對象是否相等,而equals()方法比較的是兩個(gè)對象的實(shí)際內(nèi)容。我們結(jié)合上面的內(nèi)存的劃分來理解這個(gè)區(qū)別。
String?str1=new?String("apple");
String?str2=new?String("apple");
System.out.println(s3==s4); ?//false
System.out.println(s3.equals(s4)); ?//true
?
上述幾行代碼內(nèi)存分析如下圖所示:
?
因?yàn)椤?=”比較的是兩個(gè)引用的對象是否相等,從上圖很容易看出來不等,所以System.out.println(s3==s4),結(jié)果為False;而equals()方法比較的是兩個(gè)對象的實(shí)際內(nèi)容,從圖中可以看出s3和s4都指向apple,內(nèi)容是相同的,所以System.out.println(s3.equals(s4)),結(jié)果為True。
再來看
?
String?s1="apple";
String?s2="apple";
?
內(nèi)存分析如下圖:
很容易看出System.out.println(s1==s2)的結(jié)果為True。