`

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好【已经测试过】

相关推荐

    Java中关于处理字符的方法集合.doc

    Java `String`类还提供了许多其他实用的方法,如`length()`获取字符串长度,`substring()`截取子字符串,`trim()`去除两端空白,`toUpperCase()`和`toLowerCase()`转换大小写,`indexOf()`和`lastIndexOf()`查找子串...

    java笔试算法题及答案

    // index of smaller element for (int j = low; j ; j++) { // If current element is smaller than the pivot if (arr[j] ) { i++; // swap arr[i] and arr[j] int temp = arr[i]; arr[i] = arr[j]; arr...

    常用字符串操作的实现方式

    1、 使用split方法:String[] parts = str.split(" "); for (String part : parts) { System.out.println(part); } 输出结果:"Hello" "World" 这些是Java中常用的字符串操作,它们在日常开发中扮演着至关重要的...

    字符串截取

    本文将详细探讨几种常用的字符串截取技术,包括使用`split()`方法、`StringTokenizer`类以及结合`indexOf()`与`substring()`方法的实现方式。 #### 使用`split()`方法进行字符串分割 `split()`方法是Java中最简单...

    lotus domino AJAX java打印json

    int equalIdx = token.indexOf('='); if (equalIdx != -1 && !token.equalsIgnoreCase("OpenAgent")) { String name = token.substring(0, equalIdx); String value = token.substring(equalIdx + 1); params....

    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....

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

    5. **indexOf() 和 lastIndexOf()**: 这两个方法分别用于查找指定字符或子字符串在原字符串中首次出现和最后一次出现的位置。 6. **replace() 和 replaceAll()**: `replace(oldChar, newChar)`用于替换所有旧...

    JAVA常用类的使用方法

    常用方法有 `length()`、`charAt(int index)`、`substring(int beginIndex, int endIndex)`、`concat(String str)`、`indexOf(String str)`、`replace(char oldChar, char newChar)` 等,用于字符串操作。...

    String字符串

    - `indexOf()`和`lastIndexOf()`查找子串出现的位置,`indexOf()`返回首次出现的位置,`lastIndexOf()`返回最后一次出现的位置。 - `substring()`截取字符串的一部分。 - `replace()`和`replaceAll()`用于替换...

    java performance2

    - **字符串分割**:对于简单的字符串分割操作,建议使用`String.split()`方法,但对于复杂的分割逻辑,可以考虑使用`StringTokenizer`类。 - **字符串池与intern()方法**:对于经常重复使用的字符串,可以利用字符...

    JAVA得到网卡物理地址(windows和Linux)

    if (line.indexOf("Physical Address") != -1) { lastMacAddress = line.split(":")[1].trim(); break; } } return lastMacAddress; } ``` 在上面的代码中,我们首先使用 System.getProperty("os.name") 方法...

    字符串处理例子一些相关的java代码

    - `indexOf` 和 `lastIndexOf` 方法用于在字符串中查找指定子串首次和最后一次出现的位置。例如,`str.indexOf("is")` 返回 "is" 在字符串中第一次出现的位置,`str.lastIndexOf("is")` 返回最后一次出现的位置。 ...

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

    如果对效率有较高要求,特别是在处理大量数据时,`StringTokenizer` 或结合 `indexOf()` 和 `substring()` 的方法可能是更好的选择。对于简单的分隔符和较小的字符串,`split()` 方法因其便捷性而更受欢迎。了解这些...

    Java常用类[借鉴].pdf

    - `String`:不可变的字符序列,提供丰富的操作方法,如`concat()`、`replace()`、`substring()`、`toLowerCase()`、`toUpperCase()`、`trim()`,以及检索和查找功能如`charAt()`、`startsWith()`、`indexOf()`、`...

    Java代码的优化.doc-综合文档

    如果需要频繁查找,可以考虑使用`StringBuilder`或`StringBuffer`的`indexOf()`方法,它们在多线程环境中比简单的字符串操作更为安全和高效。 在实际开发中,为了提高代码效率,可以考虑以下几点: - 避免不必要的...

    Strings

    5. **常用方法**:`String`类提供了丰富的操作方法,如`length()`获取长度,`charAt(int index)`访问特定位置的字符,`substring(int beginIndex, int endIndex)`截取子字符串,`indexOf(String str)`查找子串首次...

Global site tag (gtag.js) - Google Analytics