解決一個問題的最好方法就是發現一個問題產生的根源,即發現最本質的東西,再去解決它,
Java語言里面的equals()方法是交給開發者們自己去覆寫重寫撰寫功能的,即讓開發者去定義當滿足什么條件時,兩個Object是相等的,
equals方法是由Object提供的,允許子類進行重寫,
equals()的原始代碼實作如下:
public boolean equals(Object obj) {
return (this == obj);
}
而有一些博客說equals()是比較具體的內容是不是相同的,這個說法其實不太準確,以偏概全,這個說法的來源是很多教程都是以String類中的equals()為參照物進行舉例,String類的equals()重寫了Object物件的原始equals方法,只會比較具體的內容,
String類的equals()的具體實作代碼如下:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
而 == 是比較兩個參考在記憶體中指向的是不是同一個物件,也就是在記憶體中的存盤地址是不是一樣的,兩個物件的參考相同時(指向的是同一個物件),則 == 會回傳true,否則回傳false,
所以 == 是和Object類的原始equals()方法是等價的,
現在很多類都對equals進行了重寫,這里用常見的String類來撰寫個測驗Demo
public class TestString {
public static void main(String[] args) {
String string_1 = "codevald";
String string_2 = "codevald";
System.out.println(string_1 == string_2); //結果為true
String string_3 = new String("codevald");
String string_4 = "code" + new String("vald");
System.out.println(string_3 == string_4); //結果為false
System.out.println(string_3.equals(string_4)); //結果為true
}
}
可以看到Demo中第一個輸出陳述句結果為true
String string_1 = "codevald"會現在堆疊中創建一個對String類的參考變數string_1,然后會去字串常量池中尋找有沒有"codevald",因為是第一次創建沒有,則會將"codevald"存放進字串常量池,
String string_2 = "codevald" 又在堆疊中創建了String類的參考變數string_2,然后會去字串常量池中尋找有沒有"codevald",如果沒有,則會創建并存放進常量池,并將string_2指向"codevald",如果已經有了,則直接令string_2指向"codevald",上面的代碼已經將字串存盤進了常量池,所以兩個參考(string_1和string_2)指向同一個"codevald",回傳true,
String string_3 = new String("codevald")會在堆中創建一個物件,并將在堆疊中存在的物件參考指向堆中的物件,而String string_4則是分別用了常量池中的字串和存放物件的堆中的字串,做 + 的時候會進行動態呼叫,最后創建完生成的物件仍然存放在堆中,而兩個物件在堆中的地址是不一樣的,所以 == 會回傳false,
而String類重寫了equals方法,比較的是記憶體中存放的資料的具體內容是不是相同的,這里存放的都是"codevald",所以會回傳true,
總結
對于字串變數來說,使用""和"equals"比較字串時,其比較方法不同,""比較兩個變數本身的值,即兩個物件在記憶體中的首地址,"equals"比較字串包含內容是否相同,
對于非字串變數來說,如果沒有對equals()進行重寫的話,"==" 和 "equals"方法的作用是相同的,都是用來比較物件在堆記憶體中的首地址,即用來比較兩個參考變數是否指向同一個物件,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/259637.html
標籤:其他
