天天看點

工作 3 年的同僚不懂 isEmpty 和 isBlank 的差別,我真是醉了。。

工具類亂象

最近在檢查代碼時,發現有的同僚喜歡用 isEmpty,有的同僚喜歡用 isBlank,而且大家用的還不是同一個工具包中的,甚至還有自己手寫 String 工具類的,天呀,我真是醉了……

你們公司是否也有這樣的情況呢?别說沒有,我真不信!

說到這個事情,最近還有個工作 3 年的同僚問我 isEmpty 和 isBlank 的差別,好吧,今天就展開講下。

首先,這兩個方法用的都是工具類 StringUtils 裡面的方法,都是用來判斷字元串是否為空的,而這個工具類到處都是,如下圖所示,棧長輸入 StringUtil,很多類似的工具類就蹦出來了:

工作 3 年的同僚不懂 isEmpty 和 isBlank 的差別,我真是醉了。。

像這樣類似的 String 工具類存在不同的包中,有 Netty, Apache commons-lang3, Spring 等等,這也是造成程式員不統一工具類的原因,雖然大部分架構都會自己內建,但用的最多的,方法最全的還要屬 Apache commons-lang3 工具包。

commons-lang3 是 Apache 下面的一個開源的通用 Java 工具包,除了常用的字元串工具類,還包含數字工具類、時間工具類、反射工具類、線程工具類,等等……

更多請參考《排名前 16 的 Java 工具類》這篇文章。

為什麼推薦通用的 commons-lang3?

一方面,commons-lang3 是專業的工具包,功能非常齊全、強大。

另一方面,不一定所有的項目都會用到 Netty、Spring 等架構,它們都是架構內建的,隻有一小部分功能,方法并不齊全,是以通用的 commons-lang3 工具包對系統遷移、或者對全公司不同系統之間的共用有幫助,避免差異化引起的系統潛在 bug。

isEmpty 和 isBlank 差別?

說了這麼多,isEmpty 和 isBlank 到底有啥差別?

1)isEmpty

判斷字元串是否為空字元串,隻要有一個任意字元(包括空白字元)就不為空。

來看 isEmpty 的方法源碼:

public static boolean isEmpty(CharSequence cs) {
    return cs == null || cs.length() == 0;
}      

看見沒,這個方法隻判斷了是為為 null 或者長度為 0。

意味着,如果使用者輸入 " " 等空白字元,這個方法就不通過了,結果就是不為空了。

如驗證輸入以下内容:

工作 3 年的同僚不懂 isEmpty 和 isBlank 的差別,我真是醉了。。

2、isBlank

判斷字元串是否為空字元串,全部空白字元也為空。

來看 isBlank 的方法源碼:

public static boolean isBlank(CharSequence cs) {
    int strLen = length(cs);
    if (strLen == 0) {
        return true;
    } else {
        for(int i = 0; i < strLen; ++i) {
            if (!Character.isWhitespace(cs.charAt(i))) {
                return false;
            }
        }

        return true;
    }
}      

看見沒,第 7 行,隻要有一個字元不為空白字元就傳回 false,也就是說,如果全部都為空白字元就傳回 true,也就是全部空白字元也為空。

工作 3 年的同僚不懂 isEmpty 和 isBlank 的差別,我真是醉了。。

這時候,如果使用者輸入 " " 等空白字元,這個方法也傳回空了,這也是大部分業務場景下我們期望出現的結果。

isEmpty 和 isBlank 怎麼選?

很明顯,我們要判斷一個字元串為空,絕大部分情況下 "空白字元" 也要為空的,嚴謹來說肯定要用 isBlank,雖然 isEmpty 也可以,但如果在最前端的接口不被攔截掉,請求到了後端的服務、資料庫,就可能會造成壓力,甚至是系統異常,這是完全可以避免的。

但萬事也沒有絕對,如果你的程式可以接受任意字元,包括 "空白字元",那就要選擇 isEmpty,isBlank 會攔截所有空白字元,就達不到要求。

是以,這兩個工具方法你會用了嗎?

與之相對應的一般還有 isNotEmpty 和 isNotBlank,這都是對工具類的封裝。

好了,今天的分享就到這了,後續棧長還會繼續分享一些工作中常用的開發小技巧,關注公衆号Java技術棧第一時間推送,在公衆号菜單中還能看棧長整理的曆史工具類系列文章。

如果有幫助,點個在看鼓勵一下哦!也歡迎分享轉發給更多有需要的朋友~