StringUtils.split()和string.split()的區別


場景

出於業務考慮,將多個字符串拼接起來時,使用的分隔符是;,;。如果要將這樣一個拼接來的字符串分割成原本的多個字符串時,就需要使用到jdk自帶的split()方法。不過因為公司的編程規范,改為使用了Apache工具類的StringUtils.split()。

之后就發現,當被拼接的字符串里含有;,時,就會出現分割不正確的問題。

具體例子

下面的代碼,使用了上述的兩種split方法,猜猜結果是什么。

public class Test {

    public static void main(final String[] args) {
        final String str = "老肥,老肥;是個,逗比";
        final String seperator = ";,;";
        //Apache工具類的split方法
        final String[] result1 = StringUtils.split(str, seperator);
        for (final String string : result1) {
            System.out.println(string);
        }

        System.out.println("############分割線###########");
        //jdk的split方法
        final String[] result2 = str.split(seperator);
        for (final String string : result2) {
            System.out.println(string);
        }
    }
}

分割的結果如下:

老肥
老肥
是個
逗比
############分割線###########
老肥,老肥;是個,逗比

StringUtils.split()和string.split()的區別

StringUtils.split()是把分隔符拆成一個個單獨的字符,再用這些字符去把字符串進行分割的。只要匹配到了分隔符中的任意一個字符,就會進行分割。而string.split()是把分隔符作為一個整體來對字符串進行分割。

比如分隔符是;,;,那么在用StringUtils.split()時,只要被分割的字符串里遇到;,,就會被分割。而在用string.split()時,必須被分割的字符串里遇到;,;時才會被分割。

另外string.split()的分隔符參數其實是正則表達式,而StringUtils.split()的分隔符參數就只是個普通的字符串。此外,StringUtils.split()是null-safe的,已經幫你判空了,這也是公司規范要我們使用Apache工具類的原因。不過由於這里的業務要求,最終還是選擇使用string.split()

最后附上StringUtils.split()的部分底層實現:

//standard case
while (i < len) {
    if (separatorChars.indexOf(str.charAt(i)) >= 0) {
        if (match || preserveAllTokens) {
            lastMatch = true;
            if (sizePlus1++ == max) {
                i = len;
                lastMatch = false;
            }
            list.add(str.substring(start, i));
            match = false;
        }
        start = ++i;
        continue;
    }
    lastMatch = false;
    match = true;
    i++;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM