1. 起因:字串恆等判斷
//String is reference type String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1==str2); // false System.out.println(str1.equals(str2)); // true
線上學習影片分享:java線上學習
2. 關係運算子「==」
##重點:「==」只可以處理基本資料型別對應值的恆等判斷,不適用引用資料型別(其值存的是位址)
public class Main { public static void main(String[] args) { int n=3; int m=3; // true System.out.println(n==m); String str = new String("hello"); String str1 = new String("hello"); String str2 = new String("hello"); // false System.out.println(str1==str2); str1 = str; str2 = str; // true System.out.println(str1==str2); } }n==m結果為true,這個很容易理解,變數n和變數m儲存的值都是3,肯定是相等的。而為什麼str1和str2兩次比較的結果不同?要理解這個其實只需要理解基本資料型態變數和非基本資料型別變數的差異。
Java中的8個基本資料型別
浮點型:float, double;整數型:byte, short, int , long; 字元型: char;布林型: boolean。 對於這8種基本資料類型的變量,變數直接儲存的是“值”,因此在用關係運算元==來進行比較時,比較的就是 “值” 本身。要注意浮點型和整數型都是有符號型的,而char是無符號型別的.
對於非基本資料型別的變數(引用型別),如String型別,引用類型的變數儲存的並不是「值」本身,而是與其關聯的物件在記憶體中的位址。如,str1並不是直接儲存的字串"hello",而是該物件所對應的位址。 因此在用==對str1和str2進行第一次比較時,得到的結果是false。因為它們分別指向的是不同的對象,也就是說它們實際儲存的記憶體位址不同。而在第二次比較時,str1和str2同時指向了str指向的對象,那麼得到的結果毫無疑問是true(位址相同)。3. Object方法「equals()」
equals方法是基底類別Object中的方法,因此對於所有的繼承於Object的類別都會有該方法。在Object類別中,equals方法是用來比較兩個物件的參考是否相等,即是否指向同一個物件.public class Main { public static void main(String[] args) { String str1 = new String("hello"); String str2 = new String("hello"); // true System.out.println(str1.equals(str2)); } }String類別對equals方法進行了重寫,用來比較指向的字串物件所儲存的字串是否相等。其他的一些類別諸如Double,Date,Integer等,都對equals方法進行了重寫用來比較指向的物件所儲存的內容是否相等。
小結:
對於==:如果作用於基本資料類型的變量,則直接比較其儲存的「值」是否相等; 如果作用於引用類型的變量,則比較的是所指向的物件的位址對於equals方法:如果沒有對equals方法進行重寫,則比較的是引用類型的變數所指向的物件的位址;諸如String、 Date等類別對equals方法進行了重寫的話,比較的是所指向的物件的內容(equals方法不能作用於基本資料類型的變數)。 更多相關文章教學請造訪:以上是java中字串恆等判斷的詳細內容。更多資訊請關注PHP中文網其他相關文章!