場景
出於業務考慮,將多個字符串拼接起來時,使用的分隔符是;,;。如果要將這樣一個拼接來的字符串分割成原本的多個字符串時,就需要使用到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++;
}
