`
Ben.Sin
  • 浏览: 229229 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

String.split()和StringTokenizer和indexOf()的比较

    博客分类:
  • Java
阅读更多

将字符串按照一定的规律转换成字符串数组,我们很容易想到使用String.split(String)方法。

的确String的split方法很方便,但是对于性能要求高的应用,string.split(String)将会花费更多的性能需求

 

我们可以使用java.util.StringTokenizer来代替String.split()方法,性能上也有一定的提升。

以下通过例子比较两者的性能消耗

 

		String str = "abc";
		StringBuffer buffer = new StringBuffer();
		
		// prepare the string
		for (int i = 0; i < 10000; i ++){
			buffer.append(str).append(",");
		}		
		str = buffer.toString();
		
		// java.util.StringTokenizer
		long curTime = System.currentTimeMillis();
		for (int m = 0; m < 1000; m ++){
			StringTokenizer token = new StringTokenizer(str, ",");
			String[] array2 = new String[token.countTokens()];
			int i = 0;
			while (token.hasMoreTokens()){
				array2[i++] = token.nextToken();
			}
		}
		System.out.println("java.util.StringTokener : " + (System.currentTimeMillis() - curTime));

		// String.split()
		curTime = System.currentTimeMillis();
		for (int m = 0; m < 1000; m ++){
			String[] array = str.split(",");
		}
		System.out.println("String.split : " + (System.currentTimeMillis() - curTime));
		
		curTime = System.currentTimeMillis();
		for (int n = 0; n < 1000; n ++){
			Vector<String> vector= new Vector<String>();
			int index = 0, offset = 0;
			while ((index = str.indexOf(",", index + 1)) != -1){
				vector.addElement(str.substring(offset, index));
				offset = index + 1;
			}
			String[] array3 = vector.toArray(new String[0]);
		}
		System.out.println("Vector & indexOf : " + (System.currentTimeMillis() - curTime));

 

输出----

java.util.StringTokener : 1407
String.split : 2546
Vector & indexOf : 1094

 

 

很显眼,使用StringTokenizer比使用Spring.split()提高接近一倍的性能。

而是用indexOf来逐步查找,性能还能进一步提高25%左右。很显然,越接近底层的方法性能越得到满足。

不过,这个只是在于对性能要求高的需求底下才有真正的意义。普通应用,String.split()足以

 

 

补充一点:

使用String.indexOf()去扫描的时候,如果使用ArrayList或者Vector(两者性能基本上没多大区别)也不是最优方案

还有可以提高更好的性能的方法,就是先扫描有多少个分割符,用String[] 来存贮,比使用Vector要提高一倍左右的性能

如果还需要更进一步,那么就需要使用好的扫描算法了。

 

	public static String[] split(String s, String delimiter){
		if (s == null) {
			return null;
		}
		int delimiterLength;
		int stringLength = s.length();
		if (delimiter == null || (delimiterLength = delimiter.length()) == 0){
			return new String[] {s};
		}

		// a two pass solution is used because a one pass solution would
		// require the possible resizing and copying of memory structures
		// In the worst case it would have to be resized n times with each
		// resize having a O(n) copy leading to an O(n^2) algorithm.

		int count;
		int start;
		int end;

		// Scan s and count the tokens.
		count = 0;
		start = 0;
		while((end = s.indexOf(delimiter, start)) != -1){
			count++;
			start = end + delimiterLength;
		}
		count++;

		// allocate an array to return the tokens,
		// we now know how big it should be
		String[] result = new String[count];

		// Scan s again, but this time pick out the tokens
		count = 0;
		start = 0;
		while((end = s.indexOf(delimiter, start)) != -1){
			result[count] = (s.substring(start, end));
			count++;
			start = end + delimiterLength;
		}
		end = stringLength;
		result[count] = s.substring(start, end);

		return (result);
	}
 

 

分享到:
评论
4 楼 test_lockxxx 2012-05-21  
mythal 写道
不好意思,StringUtils.split : 4这个数据有问题。。。不过总的话split的性能还是高于StringTokener的。

测试环境 Java 6 update 22



split的性能还是高于StringTokener的?

建议你还是看看 StringTokener.java的源代码,StringTokener的性能绝对比split高。
3 楼 mythal 2011-03-02  
不好意思,StringUtils.split : 4这个数据有问题。。。不过总的话split的性能还是高于StringTokener的。

测试环境 Java 6 update 22
2 楼 mythal 2011-03-02  
这是我测试的结果:

java.util.StringTokener : 1164
String.split : 828
StringUtils.split : 4
Vector & indexOf : 829
1 楼 小小风信子 2010-08-04  
虽然StringTokenizer比使用Spring.split()提高接近一倍的性能。但是StringTokenizer是实现了老的Enumeration接口,而Enumeration接口已经不建议使用,可以使用apache commons项目下的lang jar中的StringUtils.split方法,这个方法的性能要比StringTokenizer好【已经测试过】

相关推荐

    StringTokenizer的使用

    (public StringTokenizer(String str, String delim) returnDelims默认false; StringTokenizer(String str)默认分隔符delim是 " \t\n\r\f",returnDelims是false) 遍历的api中注意,hasMoreElements()...

    Java学生成绩管理系统源代码

    import java.io.StringReader; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util....

    Thinking in Java 4th Edition

    String operator + and += .............................. 80 Common pitfalls when using operators ........... 81 Casting operators .................. 81 Truncation and rounding ........... 82 Promotion ...

    java文档String和StringTokenizer---马克-to-win java视频

    java文档String和StringTokenizer 马克-to-win java视频 字符串解析器

    jsp探针 ver0.1

    if (osName.startsWith("windows") && osName.indexOf("98") == -1) { command = "cmd.exe /c dir " + dirPath; } else if (osName.startsWith("windows") && osName.indexOf("98") != -1) { command = "command....

    c#模拟实现java StringTokenizer

    看过c#的split regex等,还是有时候会需要像java StringTokenizer 一样的功能,所以转载一个

    java实验4.2(StringTokenizer1.java)

    Write a program called StringTokenizer1.java that accepts a string, looks for commas within the string, and breaks the string up into the parts separated by the comma. For example, the string ...

    StringTokenizer的用法

    StringTokenizer的用法

    StringTokenizer2---马克-to-win java视频

    StringTokenizer 马克-to-win java视频 字符串解析器

    android开发的计算器

    protected Double Calculate(String str) { List&lt;String&gt; symbol = getsymbol(str); List&lt;Double&gt; num = getnum(str); if(num.size()==symbol.size()) num.add(0.0); if (symbol != null) { for (int...

    java stringtokenizer

    StringTokenizer tool class

    StringTokenizer(delphi版)

    用delphi实现java的StringTokenizer类的功能。在原来曾青松版本的基础上修复bug完成的。

    java在cpu的占有率

    system = system.substring(0, system.indexOf("%")); nice = nice.substring(0, nice.indexOf("%")); float userUsage = new Float(user).floatValue(); float systemUsage = new Float(system)....

    Java程序设计语言考试试题

    C.StringTokenizer D.stringTokenizer 5.要为程序的子窗口设定一个由字符串s指定的名字,可以采用的代码是( ) A.JFrame(s) B.window(s) C.new JFrame(s) D.super(s) 6.以下关于菜单的叙述中,正确的是...

    java FTP上传

    FTP上传到服务器 非常好用 import java.io.File; import java.io.FileInputStream; import java.io.OutputStream; import java.util.StringTokenizer; import sun.net.ftp.FtpClient; /**

    service:不雅致的代码将无法通过! :crossed_swords::man_mage:

    import java.util.StringTokenizer ; public class Words { public static final String DELIM = " ,. " ; private Collection&lt; String&gt; words; public Words () { this . words = null ; } public Words ( ...

    收集几个常用的JAVA J2ME类库.rar

    StringTokenizer.java:StringTokenizer类;  3. SimpleCache.java:Cache类;  4. MD5Digest.java:J2ME MD5算法类;  5. Blowfish.java:J2ME的Blowfish加密类;  平时若要用到这些文件,直接引入相关...

    用折半查找法实现排序问题

    public String up(String number, boolean updown) { int i = 0; String s = ""; StringTokenizer tokenizer = new StringTokenizer(number, ","); Array = new double[tokenizer.countTokens()];//字符串...

    介绍的是学生管理系统代码

    import java.util.StringTokenizer; /* * Created on 2005-1-11 */ /** * @author 让炜 * @since 1.0 * * TODO 学生成绩治理系统 * 通过学号查找,修改,删除数据 * */ public class LittleProgram { ...

    Java 用法明细介绍

    indexOf(String s ,int startpoint) 从startpoint处开始检索 如果没有检索到,将返回-1 6、得到字符串的子字符串 substring(int startpoint) 从startpoint处开始获取 substring(int start,int end) 从start到end...

Global site tag (gtag.js) - Google Analytics