最近在做一些字符串方面的拆分清洗和比对,趁着有空将java里多种拆分字符串的方法做一下比对,常用的四种拆分方法,第一种是字符串自带的split();其他三种是org.apache.commons.lang.StringUtils提供的方法,分别是:StringUtils.split()、StringUtils.splitByWholeSeparator()、StringUtils.splitPreserveAllTokens()。本次比对未看源码,只比对结果和效率。有兴趣的朋友可以看一下源码,比较简单。
下面是比较方法的代码:
public static void main(String[] args) {
String a = "";
out(a.split(","));
out(StringUtils.split(a, ","));
out(StringUtils.splitByWholeSeparator(a, ","));
out(StringUtils.splitPreserveAllTokens(a, ","));
}
static void out(String[] strs) {
for (int i = 0; i < strs.length; i++) {
String str = strs[i];
if (str == null) {
System.out.print("NULL");
} else if (str.equals("")) {
System.out.print("空字符");
} else if (str.equals(" ")) {
System.out.print("空格");
} else {
System.out.print(str);
}
if (i != strs.length - 1) {
System.out.print("-");
}
}
System.out.print("|" + strs.length);
System.out.println();
}
输出一下比较的结果:
字符串 方法 | 空字符 | a | ,a | ,a, | a,b | 空格,a,b | a,b,空格 | a,b, | a,b,, | ,a,b | ,,a,b |
split | 空字符|1 | a|1 | 空字符-a|2 | 空字符-a|2 | a-b|2 | 空格-a-b|3 | a-b-空格|3 | a-b|2 | a-b|2 | 空字符-a-b|3 | 空字符-空字符-a-b|4 |
StringUtils.split | |0 | a|1 | a|1 | a|1 | a-b|2 | 空格-a-b|3 | a-b-空格|3 | a-b|2 | a-b|2 | a-b|2 | a-b|2 |
splitByWholeSeparator | |0 | a|1 | a|1 | a-空字符|2 | a-b|2 | 空格-a-b|3 | a-b-空格|3 | a-b-空字符|3 | a-b-空字符|3 | a-b|2 | a-b|2 |
splitPreserveAllTokens | |0 | a|1 | 空字符-a|2 | 空字符-a-空字符|3 | a-b|2 | 空格-a-b|3 | a-b-空格|3 | a-b-空字符|3 | a-b-空字符-空字符|4 | 空字符-a-b|3 | 空字符-空字符-a-b|4 |
这里的空字符指的是 “” ,空格指的是 “ ” 。大部分拆分的情况都已经在表格里了,如果不全,还请各位在评论里补充;
最后测了一下四种方法的运行效率,代码贴在下面:
public static void main(String[] args) {
String a = "a,b, ";
long start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
out(a.split(","));
}
System.out.println(System.currentTimeMillis() - start);
start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
out(StringUtils.split(a, ","));
}
System.out.println(System.currentTimeMillis() - start);
start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
out(StringUtils.splitByWholeSeparator(a, ","));
}
System.out.println(System.currentTimeMillis() - start);
start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
out(StringUtils.splitPreserveAllTokens(a, ","));
}
System.out.println(System.currentTimeMillis() - start);
}
static void out(String[] strs) {
for (int i = 0; i < strs.length; i++) {
String str = strs[i];
}
}
经多次测试,对于相同字符串,相同运算次数,运行时间由长到短,分别是:
a.split(",")
StringUtils.split(a, ",")
StringUtils.splitByWholeSeparator(a, ",")
StringUtils.splitPreserveAllTokens(a, ",")
a.split(",")要比StringUtils.splitPreserveAllTokens(a, ",")慢2倍左右,有兴趣的朋友可以自己测试一下。
虽然效率上存在优劣,但是这四种方法拆分结果各不相同,要根据自己最终的目的去选择合适的方法。尽量不要用a.split(",")