在java開發中經常會涉及到字符串比較的問題。
比較常見就是 == 和 equals
這兩個方法都可以用來比較字符串,但是 == 要慎重使用,因爲兩個相同的字符串用 == 來比較也是會出現 false的現象。用代碼來驗證這個問題。
String a = "abcd";
String b = "ab";
String c = "cd";
String e = b + c;
String f = "abcdef";
String g = f.substring(0,4);
System.out.println("abcd".equals(a));
System.out.println("abcd".equals(e));
System.out.println("abcd".equals(g));
System.out.println();
System.out.println("abcd" == a);
System.out.println("abcd" == e);
System.out.println("abcd" == g);
a 是完整的“abcd” , e是通過 + 來拼接成“abcd” , g是通過substring字符串截取成“abcd”
1. 首先我們從equals 來看,可以看到三個對比都是true
2.再來看 == ,第二、三個比較都是false,可以得出結論通過 +號拼接 和 substring截取 是不能用 == 來比較的。
光知道不能用==來比較還不夠,還需要知道爲什麼不能比較,於是通過書籍查找和網上搜索原因。
發現 == 和 equals 比較的是兩個東西
equals比較的是字符串的內容(值),因爲上面4個字符串的內容都是 abcd ,所以返回的結果也都是true。
而 == 比較的是字符串的內存地址(引用),這裏通過 +號拼接 和 substring截取 的兩種方式改變了字符串的內存地址,理所當然,返回的結果就變爲false
總結:可以用這種方式來記憶,虛擬機始終將相同的字符串共享,就可以使用 == 運算符來檢測是否相等。但是 +號拼接 和 substring截取 返回的結果並不是共享的。所以在程序中要慎重使用 == 來比較字符串。
附上一個比較字符串(不區分大小寫)方法: equalsIgnoreCase