您好,登錄后才能下訂單哦!
長字符串切分,取其中元素封裝或者將封裝信息組合成長字符串都是常規操作,但是這種長字符串往往是不可控的,如一個長字符串就是由一個元素組成,或者存在空字符串的元素,看似這并沒有什么問題,但是使用不同工具類的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。
有分隔符,分隔符切分后沒有空字符串出現
//str = "1,2"
//代碼同上……
切分后結果是["1","2"]
,數組長度是2。(假設分隔符是n個,分割后的元素個數是n+1個)
有分隔符,分隔符切分后有空字符串出現
//str = "1,,2"
//代碼同上……
切分后結果是["1","","2"]
,數組長度是3。(假設分隔符是n個,分割后的元素個數是n+1個)
最終總結不管分隔符有多少個,最終切分的結果都是n+1個元素。也是正常業務邏輯所需要的。但是這里有一個問題,如果傳入的字符串是null
的時候會報NullPointException
異常,需要另外加一層非空判斷。
具體全限定類名是org.apache.commons.lang3.StringUtils
,這個可以說是最常用一個字符串的工具類。如判斷非null
、非空字符串或者非空格,用isNotBlank
方法,使用集合元素組裝字符串,用join
方法等等。現在來看一下split
方法在不同的情況下是如何實現。
沒有分隔符的字符串
//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。
有分隔符,分隔符切分后沒有空字符串出現
//str = "1,2"
//代碼同上……
切分后的結果是兩個元素["1","2"]
,數組長度為2。
有分隔符,分隔符切分后有空字符串出現
//str = "1,,2"
//代碼同上……
切分后的結果和上一種情況結果是一樣的,也是兩個元素["1","2"]
,數組長度為2。
從這里就可以看的出來問題的所在,當出現空字符串的時候,會自動將空字符串丟棄,只保留非空字符串。但是這里還是需要注意的是如果是空格,也會形成一個元素。比如現在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
方法必須要有分隔符的存在。
有分隔符,分隔符切分后沒有空字符串出現
//str = "1,2"
//代碼同上……
切分后的結果是兩個元素["1","2"]
,數組長度為2。
有分隔符,分隔符切分后有空字符串出現
//str = "1,,2"
//代碼同上……
切分后的結果是兩個元素["1",",2"]
,數組長度為2。看到這里可能你會認為我這個數組格式寫錯了,但是實際上第二個元素的確是這樣的,確定無疑。
這個split
方法還是很坑的,它會從字符串中找分隔符是否存在,如果不存在直接報錯,如果存在,不管有多少個分隔符,都是以第一個分隔符做切分,最終形成兩個元素。
三個split
方法三種不同的切分邏輯,到底在什么時候用那種方式切分就很講究了,因為在開發過程中因為這個切分出過很多莫名其妙的BUG。我就遇到過兩次。
org.apache.commons.lang3.StringUtils
來切分字符串,字符串內有空字符串存在,導致切割后的元素個數和實際個數不同,準確的來說少了元素,結果代碼中在向另一個字符串占位符中填充數據的時候,總是出現錯位的現象。(如本來應該放在占位符3位置上的字符串出現為空字符串,在切分的時候,3位置的元素實際被拋棄,4位置的元素放在了3的位置)org.apache.commons.lang3.StringUtils
來切分字符串,測試一直都是很正常,但是測試一段時間后,發現報NullPointException
,排查后才發現,引入的StringUtils被其他開發人員換成了org.springframework.util.StringUtils
導致的。因為這個字符串可能沒有分隔符。免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。