equals與==的區(qū)別
一其爵、String 的 isEmpty() 與 null 與 "" 區(qū)別
public class demo {
public static void main(String[] args) {
String a = new String();
String b = "";
String c = null;
test(a);
test(b);
test(c);
}
private static void test(String str) {
if (str == null) {
System.out.println("null");
}
if (str.isEmpty()) {
System.out.println("isEmpty");
}
if (str.equals("")) {
System.out.println("");
}
System.out.println("------分割線------");
}
}
通過程序段運行結(jié)果可以分析:
- a 被分配了內(nèi)存空間且值為空,是一種有值的絕對空;
- b 被分配了內(nèi)存空間且值為空字符串撬码,是一種有值的相對空儿倒;
- c 未分配內(nèi)存空間且無值,是一種無值狀態(tài)。
所以判斷一個 String 變量是否是空對象夫否,應(yīng)拿其與 null 進行 == 比較彻犁,不能使用 equals()、isEmpty()凰慈、"" 等進行判斷汞幢,因為空對象還未被實例化。
而對于 String 的空值判斷可以采用三種方法微谓,"".equals(str)
比較對象的內(nèi)容是否為空值森篷;length() == 0
來判斷 String 的字符個數(shù)是否空值;isEmpty()
來判斷 String 對象的字符個數(shù)是否為空值(其實現(xiàn)原理等價于 length() == 0)豺型。
對于空格字符串仲智,雖然在輸出顯示時候和空值一樣,都是空的姻氨,但是在運行時空格字符串表示該對象的內(nèi)存空間里面有內(nèi)容(是空格钓辆,字符個數(shù)是空格的個數(shù))。所以在使用 length() 輸出的值為空格個數(shù)肴焊,使用 isEmpty() 輸出為 false前联,使用 "".equals(str) 判斷為 false。
對于 String 的 + 操作符來說娶眷,如果有一個操作數(shù)是 String似嗤,其他操作數(shù)會被轉(zhuǎn)換成 String。特別注意茂浮,null 與字符串 "XXXX" + 操作會變成 "nullXXXX"双谆。
二、str != null 和 null != str的區(qū)別
str 席揽!= null 會出現(xiàn)空指針異常(顽馋??幌羞?)寸谜,而null !=str是永遠不會出現(xiàn)空指針異常的,是極限編程建議的做法属桦。目的是防止出錯熊痴。
正如:
str.equals("123");
如果養(yǎng)成了好的習(xí)慣,應(yīng)該寫成"123".equals(str);
因為就算str為空聂宾,還是會返回false果善,但如果用前者就會報空指針異常。
三系谐、 isEmpty(String str) 和 isBlank(String str)
org.apache.commons.lang.StringUtils
類提供了 String 的常用操作巾陕。最為常用的判空有兩種 isEmpty(String str) 和 isBlank(String str)讨跟,源碼如下:
public static boolean isEmpty(String str) {
return str == null || str.length() == 0;
}
public static boolean isNotEmpty(String str) {
return !isEmpty(str);
}
public static boolean isBlank(String str) {
int strLen;
if (str != null && (strLen = str.length()) != 0) {
for(int i = 0; i < strLen; ++i) {
if (!Character.isWhitespace(str.charAt(i))) {
return false;
}
}
return true;
} else {
return true;
}
}
public static boolean isNotBlank(String str) {
return !isBlank(str);
}
1??StringUtils.isEmpty(String str)
判斷某字符串為空的標(biāo)準(zhǔn)是 【str==null 】或 【str.length()==0】
2??StringUtils.isBlank(String str)
判斷某字符串為空的標(biāo)準(zhǔn)是 【str==null 】或【str.length()==0】或【由空白符 (whitespace) 構(gòu)成】
3??StringUtils.isNotEmpty(String str)
等價于!isEmpty(String str)
4??StringUtils.isNotBlank(String str)
等價于!isBlank(String str)
建議:
StringUtils.isBlank(String str)
來執(zhí)行判空操作,判斷的條件更多更具體鄙煤,特別是進行參數(shù)校驗時晾匠,推薦使用。