背景介紹
== 比較的是變量(棧)內(nèi)存中存放的對象的(堆)內(nèi)存地址,用來判斷兩個對象的地址是否相同,即是否是指相同一個對象。比較的是真正意義上的指針操作。
equals用來比較的是兩個對象的內(nèi)容是否相等,由于所有的類都是繼承自java.lang.object類的,所以適用于所有對象,如果沒有對該方法進(jìn)行覆蓋的話,調(diào)用的仍然是object類中的方法,而object中的equals方法返回的卻是==的判斷。
java中的數(shù)據(jù)類型可以分為兩類:
基本數(shù)據(jù)類型
byte,short,char,int,long,float,double,boolean
基本數(shù)據(jù)類型之間的比較需要用雙等號(==),因為他們比較的是值
引用數(shù)據(jù)類型
接口、類、數(shù)組等非基本數(shù)據(jù)類型
java中的字符串string屬于引用數(shù)據(jù)類型。因為string是一個類
當(dāng)他們用(==)進(jìn)行比較的時候,比較的是他們在內(nèi)存中的存放地址,所以,除非是同一個new出來的對象,他們的比較后的結(jié)果為true,否則比較后結(jié)果為false。因為沒new一次就會重新開辟一個新的堆內(nèi)存空間
1
2
3
4
5
6
7
8
9
|
entity entity = new entity(); entity entity1 = new entity(); entity entity2 = entity; system.out.println(entity==entity2); system.out.println(entity.equals(entity2)); system.out.println(entity.equals(entity1)); system.out.println(entity==entity1); |
執(zhí)行結(jié)果
true
true
false
false
equals()方法介紹
java中所有的類都是繼承與object這個基類的,在object類中定義了一個equals方法,這個方法的初始行為是比較對象的內(nèi)存地址,但在一些類庫中已經(jīng)重寫了這個方法(一般都是用來比較對象的成員變量值是否相同),比如:string,integer,date 等類中,所以他們不再是比較類在堆中的地址了、
object類中源碼
1
2
3
|
public boolean equals(object var1) { return this == var1; } |
string類中重寫后的代碼
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
public boolean equals(object var1) { if ( this == var1) { return true ; } else { if (var1 instanceof string) { string var2 = (string)var1; int var3 = this .value.length; if (var3 == var2.value.length) { char [] var4 = this .value; char [] var5 = var2.value; for ( int var6 = 0 ; var3-- != 0 ; ++var6) { if (var4[var6] != var5[var6]) { return false ; } } return true ; } } return false ; } } |
總結(jié):
對于復(fù)合數(shù)據(jù)類型之間進(jìn)行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是內(nèi)存中的存放位置的地址值,跟雙等號(==)的結(jié)果相同;如果被復(fù)寫,按照復(fù)寫的要求來。
== 的作用:
基本類型:比較的就是值是否相同
引用類型:比較的就是地址值是否相同
equals 的作用:
引用類型:默認(rèn)情況下,比較的是地址值,重寫該方法后比較對象的成員變量值是否相同
string類的equals()方法
在之前文章介紹jvm的時候,提到過一個常量池,這里咱們再來介紹下
1
2
3
4
5
6
7
8
9
10
11
12
|
string a = "abc" ; // abc在常量池中 string b = "abc" ; //棧中b指向常量池中的abc string c = new string( "abc" ); // 在堆內(nèi)存中重新開辟了一個abc的空間 string d = c.intern(); //檢查字符串池里是否存在"abc"這么一個字符串,如果存在,就返回池里的字符串;如果不存在,該方法會 把"abc"添加到字符串池中,然后再返回它的引用。 system.out.println(a==b); system.out.println(a.equals(b)); system.out.println(a==c); system.out.println(a.equals(c)); system.out.println(a==d); system.out.println(a.equals(d)); |
true
true
false
true
true
true
關(guān)于常量池的描述可以看我這篇文章: 深入java虛擬機(jī)學(xué)習(xí) -- 內(nèi)存管理機(jī)制
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對服務(wù)器之家的支持。
原文鏈接:https://www.cnblogs.com/blueskyli/p/9932017.html