java字符串分割_java字符串分割性能比较

关于字符串的分割,我用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 

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 

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 

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 

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));

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值