博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java字符串分割性能比较
阅读量:6533 次
发布时间:2019-06-24

本文共 2495 字,大约阅读时间需要 8 分钟。

hot3.png

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

你可能感兴趣的文章
一致性hash的C++实现
查看>>
Web之困:现代Web应用安全指南
查看>>
李寒峰:微信支付-无法阻挡的生活潮流
查看>>
公钥、私钥、数字证书的概念
查看>>
tortoise svn连接问题
查看>>
UICircularSlider
查看>>
JWSlideMenu
查看>>
项目管理学习之(2)-避免打地鼠式开发
查看>>
mac 关闭dashboard 开机更快
查看>>
在windows中安装Oracle 11g R2 数据库
查看>>
LOD层次细节算法-大规模实时地形的绘制
查看>>
解决EditorLineEnds.ttr被锁定导致Delphi2006-2010无法启动的问题
查看>>
节约内存:Instagram的Redis实践
查看>>
Const and volatile的区别和简介(英文版的)
查看>>
javascript测试输入以空格隔开的字符串中是否有重复的字符串,并且输出
查看>>
Crontab 命令需要注意的地方
查看>>
诺基亚的情怀正变得越来越廉价
查看>>
域帐号密码过期邮件提醒
查看>>
华为交换机DHCP SNOOPING 配置实例
查看>>
虚拟防火墙方案
查看>>