中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

字符串split操作到底有多少坑

發布時間:2020-07-19 04:29:44 來源:網絡 閱讀:767 作者:程序猿洞曉 欄目:軟件技術

微信公眾號

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

String類自帶的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異常,需要另外加一層非空判斷。

commons提供的StringUtils工具類

具體全限定類名是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",兩個分隔符間有一個空格,此時就會切分成三個元素。

Spring下util包提供的StringUtils工具類

全限定類名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導致的。因為這個字符串可能沒有分隔符。
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

沐川县| 五寨县| 长白| 瓦房店市| 班戈县| 从化市| 子洲县| 江陵县| 信阳市| 会宁县| 巴彦县| 定襄县| 开封市| 方城县| 东乡| 余干县| 靖远县| 渭南市| 西盟| 霍城县| 宁河县| 武清区| 富宁县| 普安县| 简阳市| 吉木萨尔县| 彭水| 金门县| 揭阳市| 天台县| 广南县| 田林县| 乌拉特前旗| 开原市| 黄浦区| 游戏| 康保县| 扶沟县| 岱山县| 鱼台县| 贵阳市|