文档章节

java字符串分割性能比较

凯文加内特
 凯文加内特
发布于 2014/06/03 17:59
字数 648
阅读 4231
收藏 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

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

评论(2)

凯文加内特
凯文加内特

引用来自“zhufu”的评论

我觉得应该加入比较长的字符串处理做参考更好一点
z
zhufu
我觉得应该加入比较长的字符串处理做参考更好一点
每日一则 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
java 通配符的应用— java 排序算法

这几天无聊,又重新学起java的排序算法,为DualPivotQuickSort做准备。为了更好地适应各种情况,我们选择使用通用类型T和通配符的上下界来实现,同时这次谈的是对数组对象的排序。如果你对j...

天地一MADAO_
2014/03/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

八大包装类型的equals方法

先看其中一个源码 结论:八大包装类型的equals方法都是先判断类型是否相同,不相同则是false,相同则判断值是否相等 注意:包装类型不能直接用==来等值比较,否则编译报错,但是数值的基本类型...

xuklc
41分钟前
1
0
NoSQL , Memcached介绍

什么是NoSQL 非关系型数据库就是NoSQL,关系型数据库代表MySQL 对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很耗...

TaoXu
昨天
0
0
890. Find and Replace Pattern - LeetCode

Question 890. Find and Replace Pattern Solution 题目大意:从字符串数组中找到类型匹配的如xyy,xxx 思路: 举例:words = ["abc","deq","mee","aqq","dkd","ccc"], pattern = "abb"abc ......

yysue
昨天
1
0
Linux | Redis

写在前面的话 常言道,不作笔记不读书。在下是深有体会啊,所以,跟我一起做下本节的笔记吧,或许多年以后,你一定会感谢今天的你。 安装 在官网的下载页 Redis Download 直接写了在Linux的安...

冯文议
昨天
2
0
NoSQL-memcached

NoSQL介绍 NoSQL叫非关系型数据库。而关系型数据库代表有MySQL。对于关系型数据库来说,是需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当量非常大的时候就很...

ln97
昨天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部