本篇內容介紹了“Java的"=="和 equals方法究竟有什么區別”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
先說”==”:
對于基本數據類型 (byte,short,char,int,long,float,double,boolean)的變量”==”比較的是兩個變量的值是否相等。
比如:int a = 3; int b = 3; a==b;返回就是true
對于引用類型如,則比較的是該變量所指向的地址.
拿我們最常用的String型來舉例:
比如:String a = “abc”; String b = “abc”;
在這種情況下 字符串直接賦值給變量,該字符串會進入到常量池中,當第一次將 “abc”賦值給a的時候,會去常量池中找看有沒有”abc”這個字符串,如果有的話,就將a指向該字符串在常量池中的地址,如果沒有則在常量池中創建,第二次賦值 將 “abc”賦值給b的時候同樣去常量池中找”abc”這個字符串,然后將他的地址賦值給b.
所以我們在做 a==b操作的時候返回的為true
再來看另一種情況:String a = new String(“abc”) ; String b = new String(“abc”);
這種情況下 創建出來的”abc”對象會被存儲到堆,a和b指向的“abc”分別存儲到堆內存的不同位置。a和b里面保存的是”abc”在堆里面的內存首地址,這兩個地址明顯是不同的,所以我們在做 a==b操作的時候返回的為false
再來看”equals”:
Equals方法是在Object類中定義的,所有的類都繼承于Object類,所以所有的類都有equals方法。
我們來看看equals方法的源碼:
public boolean equals(Object obj) {
return (this == obj);
}
可以看到在Object類的equals方法中也是用的”==”來進行比較,所以在進行比較時它和”==”應該時等價的,但是為什么我們在做 字符串比較的時候 兩者比較出來的結果不一樣呢?
原因就是 String類型對equals方法進行了重寫。我們來看源碼:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
從源碼我們可以看出,在String的equals方法中對字符串的字符進行了逐一比較如果都相同則返回true.所以對于String中的equals方法比較的是兩個字符串的內容對于:
String a = new String(“abc”) ; String b = new String(“abc”);
由于a和b的內容相同,返回true.
總結:
對于字符串的比較“==”比較的是兩個字符串的地址
對于字符串的比較 “equals”比較的是兩個字符串的內容
“Java的"=="和 equals方法究竟有什么區別”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。