Java中關(guān)于isEmpty方法、null以及““的區(qū)別
關(guān)于isEmpty方法、null以及““的區(qū)別
這是一個(gè)比較容易混淆的概念,為了弄清楚這個(gè)問題,最好的方法當(dāng)然是寫程序來驗(yàn)證,開門見山,上代碼!
public class TestNull { public static void main(String[] args) { String a = new String(); String b = ""; String c = null; if (a.isEmpty()) { System.out.println("String a = new String"); } if (b.isEmpty()) { System.out.println("String b = \"\""); } if (c == null) { System.out.println("String c = null"); } if (null == a) { System.out.println("String a = null"); } if (a == "") { System.out.println("a = ''"); } if (a.equals("")) { // 由于a是字符串,字符串的比較需要用equals,不能直接用 == System.out.println("a.equals(\"\") is true"); } /*if (c.isEmpty()) { // 這里會報(bào)空指針,即null不能使用此方法 System.out.println("c == null and c.isEmpty"); }*/ List<String> list = new ArrayList<>(); // list.add(""); if (list.isEmpty()) { System.out.println("list is empty"); } System.out.println(list.size()); } }
控制臺輸出
分析
- 此時(shí)a是分配了內(nèi)存空間,但值為空,是絕對的空,是一種有值(值存在為空而已)。
- 此時(shí)b是分配了內(nèi)存空間,值為空字符串,是相對的空,是一種有值(值存在為空字串)。
- 此時(shí)c是未分配內(nèi)存空間,無值,是一種無值(值不存在)。
綜上所述
isEmpty() | 分配了內(nèi)存空間,值為空,是絕對的空,是一種有值(值 = 空) |
"" | 分配了內(nèi)存空間,值為空字符串,是相對的空,是一種有值(值 = 空字串) |
null | 是未分配內(nèi)存空間,無值,是一種無值(值不存在) |
Java如何快速判null或““
前期測試代碼
package com.study.string; import cn.hutool.core.util.StrUtil; import org.springframework.util.StringUtils; /** * @ClassName StringTest * @Description Java中如何判null或"" * @Author Jiangnan Cui * @Date 2023/3/21 21:54 * @Version 1.0 */ public class StringTest { public static void main(String[] args) { String string = "test"; String nullString = null; String emptyString = ""; // 0.判null + 判"":直觀、方便,但效率極低 if(nullString == null || nullString == ""){// 我是null! System.out.println("我是null!"); } if(emptyString == null || emptyString == ""){// 我是 ! System.out.println("我是 !"); } // 1.判null + 判"":判""前要保證字符串不為null,否則調(diào)用String方法時(shí)會拋出空指針異常 if(nullString == null || nullString.length() == 0){// 我是null! System.out.println("我是null!"); } if(emptyString == null || emptyString.length() == 0){// 我是 ! System.out.println("我是 !"); } // 2.判null + 判"":判""前要保證字符串不為null,且要將非null的字符串放在前面,否則會產(chǎn)生空指針異常 if(nullString == null || "".equals(nullString)){//我是null! System.out.println("我是null!"); } if(emptyString == null || "".equals(emptyString)){// 我是 ! System.out.println("我是 !"); } // 3.判null + 判"":判""前要保證字符串不為null,否則調(diào)用String方法時(shí)會拋出空指針異常 if(nullString == null || nullString.isEmpty()){// 我是null! System.out.println("我是null!"); } if(emptyString == null || emptyString.isEmpty()){// 我是 ! System.out.println("我是 !"); } /** * 底層源碼: * private final char value[]; * public boolean isEmpty() { * return value.length == 0; * } * 底層還是調(diào)用數(shù)組的length方法,前提是不為null */ // 4.判null + 判"" if (StringUtils.isEmpty(nullString)) {// 我是null! System.out.println("我是null!"); } if (StringUtils.isEmpty(emptyString)) {// 我是 ! System.out.println("我是 !"); } /** * 底層源碼: * @Deprecated * public static boolean isEmpty(@Nullable Object str) { * return str == null || "".equals(str); * } * 底層是分別判斷字符串是否為null或者為“” */ // 5.Hutool中的isEmpty方法:判null + 判"" boolean b = StrUtil.isEmpty(string);// b = false System.out.println("b = " + b); boolean isNull = StrUtil.isEmpty(nullString);// isNull = true System.out.println("isNull = " + isNull); boolean isEmpty = StrUtil.isEmpty(emptyString);// isEmpty = true System.out.println("isEmpty = " + isEmpty); /** * 底層源碼: * public static boolean isEmpty(CharSequence str) { * return str == null || str.length() == 0; * } * 底層是分別判斷字符串是否為null或者為“” */ // 6.Hutool中的isBlank方法:判null + 判"" b = StrUtil.isBlank(string);// b = false System.out.println("b = " + b); isNull = StrUtil.isBlank(nullString);// isNull = true System.out.println("isNull = " + isNull); isEmpty = StrUtil.isBlank(emptyString);// isEmpty = true System.out.println("isEmpty = " + isEmpty); /** * 底層源碼: * public static boolean isBlank(CharSequence str) { * int length; * if (str != null && (length = str.length()) != 0) { * for(int i = 0; i < length; ++i) { * if (!CharUtil.isBlankChar(str.charAt(i))) { * return false; * } * } * return true; * } else { * return true; * } * } */ /** * 推薦使用Hutool工具類的isEmpty或isBlank方法: */ System.out.println(StrUtil.isEmpty("test"));// false System.out.println(StrUtil.isEmpty(""));// true System.out.println(StrUtil.isEmpty(null));// true System.out.println(StrUtil.isBlank("test"));// false System.out.println(StrUtil.isBlank(""));// true System.out.println(StrUtil.isBlank(null));// true System.out.println(StrUtil.isNotEmpty("test"));// true System.out.println(StrUtil.isNotEmpty(""));// false System.out.println(StrUtil.isNotEmpty(null));// false System.out.println(StrUtil.isNotBlank("test"));// true System.out.println(StrUtil.isNotBlank(""));// false System.out.println(StrUtil.isNotBlank(null));// false } }
心得
實(shí)際應(yīng)用中推薦使用Hutool工具類中的StrUtil類下方法(isEmpty、isNotEmpty、isBlank、isNotBlank)進(jìn)行判null或者判"",對應(yīng)源碼如下:
public static boolean isEmptyIfStr(Object obj) { if (null == obj) { return true; } else if (obj instanceof CharSequence) { return 0 == ((CharSequence)obj).length(); } else { return false; } } public static boolean isNotEmpty(CharSequence str) { return !isEmpty(str); } public static boolean isBlank(CharSequence str) { int length; if (str != null && (length = str.length()) != 0) { for(int i = 0; i < length; ++i) { if (!CharUtil.isBlankChar(str.charAt(i))) { return false; } } return true; } else { return true; } } public static boolean isNotBlank(CharSequence str) { return !isBlank(str); }
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Spring Data JPA 之 JpaRepository的使用
這篇文章主要介紹了Spring Data JPA 之 JpaRepository的使用方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02SpringMVC xml文件路徑在web.xml中的配置方式
這篇文章主要介紹了SpringMVC xml文件路徑在web.xml中的配置方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09Spring?Boot項(xiàng)目抵御XSS攻擊實(shí)戰(zhàn)過程
XSS攻擊又稱跨站腳本攻擊,通常指利用網(wǎng)頁開發(fā)時(shí)留下的漏洞,通過巧妙的方法注入惡意指令代碼到網(wǎng)頁,使用戶加載并執(zhí)行攻擊者惡意制造的網(wǎng)頁程序,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot項(xiàng)目抵御XSS攻擊的相關(guān)資料,需要的朋友可以參考下2022-11-11MyBatis批量插入幾千條數(shù)據(jù)為何慎用foreach
這篇文章主要介紹了MyBatis批量插入幾千條數(shù)據(jù)為何慎用foreach問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-10-10Java設(shè)計(jì)模式之橋接模式詳解(Bridge Pattern)
橋接模式是一種結(jié)構(gòu)型設(shè)計(jì)模式,旨在將抽象部分與其實(shí)現(xiàn)部分分離,從而使兩者可以獨(dú)立地變化,橋接模式通過組合關(guān)系代替繼承關(guān)系,將抽象和實(shí)現(xiàn)解耦,使代碼更具擴(kuò)展性和維護(hù)性2025-02-02