
長字符串切分,取其中元素封裝或者將封裝信息組合成長字符串都是常規(guī)操作,但是這種長字符串往往是不可控的,如一個長字符串就是由一個元素組成,或者存在空字符串的元素,看似這并沒有什么問題,但是使用不同工具類的split方法進行切分結果是完全不同的。不知道你是否遇到這樣的坑,下面一起來看看。

直接使用String本身自帶的split方法,看對不同字符串的切分結果。
沒有分隔符的字符串
//str = "1"
public static void split2(String str) {
String[] splits = str.split(",");
for (String split : splits) {
System.out.println("->" + split);
}
System.out.println("數組長度:" + splits.length);
}切分后結果是單個元素["1"],數組長度是1。
有分隔符,分隔符切分后沒有空字符串出現(xiàn)
//str = "1,2"
//代碼同上……切分后結果是["1","2"],數組長度是2。(假設分隔符是n個,分割后的元素個數是n+1個)
有分隔符,分隔符切分后有空字符串出現(xiàn)
//str = "1,,2"
//代碼同上……切分后結果是["1","","2"],數組長度是3。(假設分隔符是n個,分割后的元素個數是n+1個)
最終總結不管分隔符有多少個,最終切分的結果都是n+1個元素。也是正常業(yè)務邏輯所需要的。但是這里有一個問題,如果傳入的字符串是null的時候會報NullPointException異常,需要另外加一層非空判斷。
具體全限定類名是org.apache.commons.lang3.StringUtils,這個可以說是最常用一個字符串的工具類。如判斷非null、非空字符串或者非空格,用isNotBlank方法,使用集合元素組裝字符串,用join方法等等。現(xiàn)在來看一下split方法在不同的情況下是如何實現(xiàn)。
沒有分隔符的字符串
//str = "1"
public static void split1(String str) {
String[] splits = org.apache.commons.lang3.StringUtils.split(str, ",");
for (String split : splits) {
System.out.println("->" + split);
}
System.out.println("數組長度:" + splits.length);
}切分后的結果是單個元素["1"],數組長度為1。
有分隔符,分隔符切分后沒有空字符串出現(xiàn)
//str = "1,2"
//代碼同上……切分后的結果是兩個元素["1","2"],數組長度為2。
有分隔符,分隔符切分后有空字符串出現(xiàn)
//str = "1,,2"
//代碼同上……切分后的結果和上一種情況結果是一樣的,也是兩個元素["1","2"],數組長度為2。
從這里就可以看的出來問題的所在,當出現(xiàn)空字符串的時候,會自動將空字符串丟棄,只保留非空字符串。但是這里還是需要注意的是如果是空格,也會形成一個元素。比如現(xiàn)在str輸入的是"1, ,2",兩個分隔符間有一個空格,此時就會切分成三個元素。
全限定類名org.springframework.util.StringUtils,這個StringUtils也經常被用到,因為在輸入StringUtils的時候,IDEA自動提示,往往它就是在第一位。那它和上面兩種在split方法上有什么不同呢?
沒有分隔符的字符串
//str = "1"
public static void split3(String str) {
String[] splits = org.springframework.util.StringUtils.split(str, ",");
for (String split : splits) {
System.out.println("->" + split);
}
System.out.println("數組長度:" + splits.length);
}這個時候對不起,會報NullPointerException異常,也就是這個split方法必須要有分隔符的存在。
有分隔符,分隔符切分后沒有空字符串出現(xiàn)
//str = "1,2"
//代碼同上……切分后的結果是兩個元素["1","2"],數組長度為2。
有分隔符,分隔符切分后有空字符串出現(xiàn)
//str = "1,,2"
//代碼同上……切分后的結果是兩個元素["1",",2"],數組長度為2。看到這里可能你會認為我這個數組格式寫錯了,但是實際上第二個元素的確是這樣的,確定無疑。
這個split方法還是很坑的,它會從字符串中找分隔符是否存在,如果不存在直接報錯,如果存在,不管有多少個分隔符,都是以第一個分隔符做切分,最終形成兩個元素。
三個split方法三種不同的切分邏輯,到底在什么時候用那種方式切分就很講究了,因為在開發(fā)過程中因為這個切分出過很多莫名其妙的BUG。我就遇到過兩次。
org.apache.commons.lang3.StringUtils來切分字符串,字符串內有空字符串存在,導致切割后的元素個數和實際個數不同,準確的來說少了元素,結果代碼中在向另一個字符串占位符中填充數據的時候,總是出現(xiàn)錯位的現(xiàn)象。(如本來應該放在占位符3位置上的字符串出現(xiàn)為空字符串,在切分的時候,3位置的元素實際被拋棄,4位置的元素放在了3的位置)org.apache.commons.lang3.StringUtils來切分字符串,測試一直都是很正常,但是測試一段時間后,發(fā)現(xiàn)報NullPointException,排查后才發(fā)現(xiàn),引入的StringUtils被其他開發(fā)人員換成了org.springframework.util.StringUtils導致的。因為這個字符串可能沒有分隔符。另外有需要云服務器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。
本文名稱:字符串split操作到底有多少坑-創(chuàng)新互聯(lián)
轉載來于:http://chinadenli.net/article46/eojeg.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、服務器托管、面包屑導航、網站設計公司、ChatGPT、建站公司
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內容