您的位置:首页 > 编程语言 > Java开发

java字符串分割性能比较

2015-06-17 11:37 459 查看
关于字符串的分割,我用jdk的split、apache的common的split、正则表达式、StringTokenizerr以及substring做了以下比较,比较的时间为纳秒,用一个字符串“192.168.20.121”作为示例,

打印时间为:

使用jdk的split切分字符串
192 168 20 121 花费时间1086171
使用common的split切分字符串
192 168 20 121 花费时间9583620
使用StringTokenizer的切分字符串
192 168 20 121 花费时间184380
使用jdk的pattern切分字符串
192 168 20 121 花费时间222654
使用jdk的substring切分字符串
192 168 20 121 花费时间157562
虽然每次打印的时间不太相同,但是基本相差不大。

通过以上分析得知使用substring和StringTokenizer的效率相对较高,其它相对较差。

为什么StringTokenizer的性能相对好些呢?通过分析发现

StringTokener.hasMoreElement和String.split(String.split是用正则表达式匹配,所以不使用KMP字符串匹配算法)用的都是按顺序遍历的算法,时间复杂度O(m*n),较高。

不过StringTokener是一边按顺序遍历,一边返回每个分组;而Spring.split是全部分组完成,再返回字符串数组。这个区别不大,但是如果我们不需要全部都分组,只需要某个分组的字符串,那么StringTokener性能会好点。

apacheJakatar的StringUtils一样用了KMP算法(按序查找字符串,时间是O(m+n)),按理说效率应该最高,但是为啥性能会比较差呢,需要进一步研究。不过有一个优点是如果使用一些转义字符

如“.”、“|”等不需要加"\\",如果使用jdk的split必须加转义。

附源码:

String ip ="192.168.20.121";

long st1 = System.nanoTime();
String[] ips =ip.split("\\.");
System.out.println("使用jdk的split切分字符串");
for (int i = 0; i < ips.length; i++) {
System.out.print(ips[i]+"  ");
}
System.out.println("花费时间"+(System.nanoTime()-st1));

long st2 = System.nanoTime();
ips= StringUtils.split(ip,"\\.");
System.out.println("使用common的split切分字符串");
for (int i = 0; i < ips.length; i++) {
System.out.print(ips[i]+"  ");
}
System.out.println("花费时间"+(System.nanoTime()-st2));

long st3 = System.nanoTime();
System.out.println("使用StringTokenizer的切分字符串");
StringTokenizer token=new StringTokenizer(ip,".");
while(token.hasMoreElements()){
System.out.print(token.nextToken()+"  ");
}
System.out.println("花费时间"+(System.nanoTime()-st3));

long st4 = System.nanoTime();
Pattern pattern = Pattern.compile("\\.");
ips =pattern.split(ip);
System.out.println("使用jdk的pattern切分字符串");
for (int i = 0; i < ips.length; i++) {
System.out.print(ips[i]+"  ");
}
System.out.println("花费时间"+(System.nanoTime()-st4));

long st5 = System.nanoTime();
System.out.println("使用jdk的indexOf切分字符串");
int k=0,count=0;
StringBuilder sb = new StringBuilder();
for (int i = 0; i < ip.length(); i++) {
if(ip.substring(i, i+1).equals(".")){
if(count==0){
System.out.print(ip.substring(0, i)+"  ");
}else if(count==1){
System.out.print(ip.substring(k+1, i)+"  ");
}else{
System.out.print(ip.substring(k+1, i)+"  ");
System.out.print(ip.substring(i+1, ip.length())+"  ");
}
k=i;count++;
}
}
System.out.println("花费时间"+(System.nanoTime()-st5));

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: