`
kfyfly
  • 浏览: 54317 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

 

分享到:
评论
2 楼 jaredhu 2018-01-04  
换个顺序测试下,就傻眼了
1 楼 heipacker 2013-04-13  
这测试会不会有点片面呀

相关推荐

    Java字符串分隔方法split实践

    这个方法允许我们根据特定的分隔符将一个字符串分割成多个子字符串,这对于数据解析、格式转换等场景非常有用。在本文中,我们将深入探讨`split()`方法的实践应用。 `split()`方法位于`java.lang.String`类中,它的...

    java 分割字符串

    `split()`方法接受一个正则表达式作为参数,然后根据这个正则表达式将字符串分割成多个部分,并返回一个字符串数组。如果正则表达式匹配到的是空字符串,那么相邻的字符也会被分割。 ### 2. 使用示例 下面是一个...

    JAVA 字符串 操作

    在Java编程语言中,字符串...以上只是Java字符串操作的一小部分,实际开发中还有许多其他方法和特性,如国际化(I18N)、正则表达式等,都需要程序员灵活掌握。理解并熟练运用这些操作,能有效提高代码质量和效率。

    JAVA 字符串应用笔记

    当需要频繁修改字符串时,应使用`StringBuilder`或线程安全的`StringBuffer`,它们提供了动态增长的机制,性能优于多次创建新字符串。 5. **字符串连接操作**: 在Java 5及以上版本,可以使用`+`操作符连接字符串...

    Java 实例 - 字符串分割源代码-详细教程.zip

    这个详细教程应该包含了对Java字符串分割的全面介绍,从基本用法到高级技巧,帮助你更好地理解和运用这一功能。通过实践这些示例代码,你可以加深对Java字符串处理的理解,并能够灵活地解决实际编程问题。

    java字符串实验题目

    在分析和解决Java字符串实验题目时,我们需要综合运用上述知识,例如查找子串、替换字符、分割字符串、处理异常情况等。理解并熟练掌握这些基本概念和方法,对于提升Java编程能力至关重要。 总之,Java中的字符串...

    Java 字符串与文本相关实例源码

    在Java编程语言中,字符串(String)是至关重要的数据类型,用于处理文本信息。字符串是不可变的,这意味着一旦创建,就不能更改其...通过学习和实践这些示例,开发者可以更好地掌握Java字符串操作的技巧,提升编程能力。

    Java 字符串

    Java提供多种方法来比较字符串: 1. `equals()`:比较字符串的内容是否相等,忽略大小写可使用`equalsIgnoreCase()`。 2. `compareTo()`:根据字典顺序比较字符串,返回值表示字符串的相对位置,0表示相等,负值...

    Java 字符串操作源码实例集.rar

    使用正则表达式将字符串分割成一个字符数组,例如`str.split(delimiter)`。 11. **toUpperCase() 和 toLowerCase()**: 将字符串转换为大写或小写。 12. **StringBuffer 和 StringBuilder**: 当需要大量修改...

    OJ_将数组中的字符串按指定长度重新分割

    标题“OJ_将数组中的字符串按指定长度重新分割”涉及的是一个在线编程挑战(OJ,Online Judge)的问题,其核心是处理字符串数组,并按照特定的长度要求进行分割。这个问题主要涵盖以下知识点: 1. **字符串操作**:...

    java字符串 详解 java实例20

    本实例“Java字符串详解 Java实例20”将深入探讨Java中的字符串处理机制,包括其创建、操作以及性能优化等方面的知识。 一、字符串的创建与初始化 在Java中,字符串是对象,它们被封装在`String`类中。字符串可以...

    java 字符串分割的三种方法(总结)

    在选择字符串分割方法时,应根据实际需求和性能要求来决定。如果对效率有较高要求,特别是在处理大量数据时,`StringTokenizer` 或结合 `indexOf()` 和 `substring()` 的方法可能是更好的选择。对于简单的分隔符和较...

    浅谈Java字符串Java开发Java经验技巧共11页.p

    标题中的“浅谈Java字符串Java开发Java经验技巧共11页”表明这是一份关于Java编程,特别是关于Java字符串处理的深度技术文档。在Java中,字符串是编程中经常遇到的基本数据类型,对于任何Java开发者来说,理解和掌握...

    从字符串中查找字符出现次数的方法和性能对比

    第三种方法通过将目标字符作为分隔符,使用`String.Split`方法分割字符串,然后通过结果数组的长度减一得到目标字符的出现次数。实现代码如下: ```csharp int c3 = str.Split(new char[] {'A'}).Length - 1; ``` ...

    浅谈Java字符串编程开发技术共3页.pdf.zip

    Java字符串编程开发技术是Java开发中的核心...总的来说,Java字符串编程开发技术涉及许多方面,包括字符串的创建、操作、连接、转换、比较以及效率优化。理解并熟练掌握这些知识点对于任何Java开发者都是必不可少的。

    Java课件\第二讲_字符串

    5. **字符串比较**:`compareTo(String anotherString)`比较两个字符串的顺序,返回值是它们的字典顺序差异。 6. **区域匹配**:`regionMatches()`检查两个字符串的指定部分是否相同。 7. **开头与结尾检查**:`...

    java字符串和数组基础共21页.pdf.zip

    例如,可以使用`split()`方法将字符串分割成字符数组,而`join()`方法则能将数组元素组合成一个字符串。此外,`toString()`方法可以帮助我们将数组转换为可读的字符串形式,这对于调试和日志记录非常有用。 总之,...

    JAVA字符串中所用的方法.rar

    - `split(String regex)`: 根据正则表达式将字符串分割成数组。 8. **转换为字符数组** - `toCharArray()`: 将字符串转换为字符数组。 9. **转义字符** - `trim()`: 去除字符串开头和结尾的空白字符。 - `...

    java中截取带汉字的字符串

    3. **性能考虑**:对于非常大的字符串,频繁调用`substring`方法可能会导致性能下降,可以考虑优化算法减少不必要的字符串复制操作。 通过以上方法,我们可以在Java中有效地处理包含中文字符的字符串截取问题,避免...

    JAVA 数组与字符串课程文档

    字符串类提供了丰富的操作方法,如获取长度的`length()`,获取子串的`substring()`,查找子串的`indexOf()`,替换子串的`replace()`,以及分割字符串的`split()`等。在处理字符串时,可以使用`StringBuffer`或`...

Global site tag (gtag.js) - Google Analytics