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

}**

转载自:https://my.oschina.net/ydsakyclguozi/blog/272082

给TA打赏
共{{data.count}}人
人已打赏
安全技术

详解Node.js API系列 Http模块(2) CNodejs爬虫实现

2021-12-21 16:36:11

安全技术

从零搭建自己的SpringBoot后台框架(二十三)

2022-1-12 12:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索