文档章节

java字符串分割性能比较

凯文加内特
 凯文加内特
发布于 2014/06/03 17:59
字数 648
阅读 4292
收藏 14

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


本文转载自:http://kfyfly.iteye.com/blog/1105716

共有 人打赏支持
凯文加内特
粉丝 333
博文 667
码字总数 87615
作品 0
青岛
后端工程师
加载中

评论(2)

凯文加内特
凯文加内特

引用来自“zhufu”的评论

我觉得应该加入比较长的字符串处理做参考更好一点
z
zhufu
我觉得应该加入比较长的字符串处理做参考更好一点
Java性能优化之String字符串优化

字符串是软件开发中最重要的对象之一。通常,字符串对象在内存中是占据了最大的空间块,因此如何高效地处理字符串,必将是提高整体性能的关键所在。 1.字符串对象及其特点 Java中八大基本数据...

像风一样i
08/22
0
0
每日一则 Linux Shell命令

find . -iname '.java' -exec wc -l {} ; | sort -n | cut --delimiter=. -f 1 | awk '{s+=$1}END{print s}' find . 查询当前目录 -iname 查询文件名,并忽略大小写 '.java' 涉及到一点点正则......

zxmit
2015/02/06
0
0
Java使用字符串的几个常见问题

今天上班的时候发现有人使用==来比较空串"",本人一直都是使用equals来比较的,所以特意上网查询了一下,有部分内容借鉴网上的blog。 以下列举10个比较常见的Java字符串问题。 1. 如何比较字...

半夏alvin
2014/04/23
0
0
java中 split方法的使用须知

详细出处参考:http://www.freezq.cn/article/380.htm java中的split函数和js中的split函数不一样。 Java中的我们可以利用split把字符串按照指定的分割符进行分割,然后返回字符串数组,下面...

手绘灿烂
2014/04/22
0
0
Android编译系统 - pathmap.mk(宏)

build/core/pathmap.mk 文件定义了一个列表pathmap_INCL,列表中每项是"短名:路径"对。宏函数include-path-for将会使用这个列表,来通过短名获取相对于的路径, 如:$(call include-path-for...

我爱咸蛋黄
2013/04/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

创建第一个react项目

sudo npm i -g create-react-app@1.5.2 create-react-app react-app cd react-apprm -rf package-lock.jsonrm -rf node_modules #主要是为了避免报错npm installnpm start......

lilugirl
今天
1
0
在浏览器中进行深度学习:TensorFlow.js (八)生成对抗网络 (GAN)

Generative Adversarial Network 是深度学习中非常有趣的一种方法。GAN最早源自Ian Goodfellow的这篇论文。LeCun对GAN给出了极高的评价: “There are many interesting recent development...

naughty
今天
0
0
搬瓦工镜像站bwh1.net被DNS污染,国内打不开搬瓦工官网

今天下午(2018年10月17日),继搬瓦工主域名bandwagonhost.com被污染后,这个国内的镜像地址bwh1.net也被墙了。那么目前应该怎么访问搬瓦工官网呢? 消息来源:搬瓦工优惠网->搬瓦工镜像站b...

flyzy2005
今天
6
0
SpringBoot自动配置

本篇介绍下,如何通过springboot的自动配置,将公司项目内的依赖jar,不需要扫描路径,依赖jar的情况下,就能将jar内配置了@configuration注解的类,创建到IOC里面 介绍下开发环境 JDK版本1.8 spr...

贺小五
今天
5
0
命令行新建Maven多项目

参考地址 # DgroupId 可以理解为包名# DartifactId 可以理解为项目名mvn archetype:generate -DgroupId=cn.modfun -DartifactId=scaffold -DarchetypeArtifactId=maven-archetype-quickst......

阿白
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部