欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中關(guān)于isEmpty方法、null以及““的區(qū)別

 更新時(shí)間:2023年08月21日 09:23:40   作者:望穿秋水見伊人  
這篇文章主要介紹了Java中關(guān)于isEmpty方法、null以及““的區(qū)別,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

關(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)文章

  • Java多線程 原子操作類詳細(xì)

    Java多線程 原子操作類詳細(xì)

    這篇文章主要介紹了Java多線程中的原子操作類,原子的本意是不能被分割的粒子,而對于一個(gè)操作來說,如果它是不可被中斷的一個(gè)或者一組操作,那么他就是原子操作。顯然,原子操作是安全的,因?yàn)樗粫淮驍?需要的朋友可以參考下
    2021-10-10
  • springboot聚合工程的部署與深入講解

    springboot聚合工程的部署與深入講解

    最近在寫一個(gè)商城,使用Maven聚合工程來管理,但是其中搭建環(huán)境遇見了各種的坑,下面這篇文章主要給大家介紹了關(guān)于springboot聚合工程部署的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Spring Data JPA 之 JpaRepository的使用

    Spring Data JPA 之 JpaRepository的使用

    這篇文章主要介紹了Spring Data JPA 之 JpaRepository的使用方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • 10分鐘帶你徒手寫個(gè)Java線程池

    10分鐘帶你徒手寫個(gè)Java線程池

    我們自己手動實(shí)現(xiàn)的線程池要比Java自身的線程池簡單的多,我們?nèi)サ袅烁鞣N復(fù)雜的處理方式,只保留了最核心的原理,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-04-04
  • SpringMVC xml文件路徑在web.xml中的配置方式

    SpringMVC xml文件路徑在web.xml中的配置方式

    這篇文章主要介紹了SpringMVC xml文件路徑在web.xml中的配置方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Spring?Boot項(xiàng)目抵御XSS攻擊實(shí)戰(zhàn)過程

    Spring?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-11
  • Java經(jīng)典用法總結(jié)(二)

    Java經(jīng)典用法總結(jié)(二)

    這篇文章主要介紹了Java經(jīng)典用法總結(jié),在本文中,盡量收集一些java最常用的習(xí)慣用法,特別是很難猜到的用法,本文重點(diǎn)講解了java應(yīng)用和輸入輸出常用方法,感興趣的小伙伴們可以參考一下
    2016-02-02
  • Java效率工具之Lombok的具體使用

    Java效率工具之Lombok的具體使用

    這篇文章主要介紹了Java效率工具之Lombok的具體使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • MyBatis批量插入幾千條數(shù)據(jù)為何慎用foreach

    MyBatis批量插入幾千條數(shù)據(jù)為何慎用foreach

    這篇文章主要介紹了MyBatis批量插入幾千條數(shù)據(jù)為何慎用foreach問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-10-10
  • Java設(shè)計(jì)模式之橋接模式詳解(Bridge Pattern)

    Java設(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

最新評論