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

将字符串按照一定的规律转换成字符串数组,我们很容易想到使用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);
	}
 

 

2.理解代码,写出执行结果。 System. out. println("b". matches("[abc]")); System. out. println("b". matches("[^abc]")); System. out. println("A". matches("[a-zA-Z]")); System. out. println("A". matches("[a-z[A-Z]]")); System. out. println("R". matches("[A-Z&&[RFG]]")); System. out. println("\n\t". matches("\\s{2}")); System. out. println("". matches("\\S")); System. out. println("3". matches("\\d")); System. out. println("&". matches("\\D")); System. out. println("a_8". matches("\\w{3}")); System. out. println("\n". matches(".")); System. out. println("\\u0041\\\\". matches("A\")); System. out. println("aaaa". matches("a*")); System. out. println("aaaa". matches("a+")); System. out. println("aaaa". matches("a?")); System. out. println("". matches("a?")); System. out. println("aaaa". matches("a{4}")); System. out. println("abcabcabc". matches("(abc){2,}")); System. out. println("4563456257". matches("\\d{3,10}")); 3.理解代码,写出程序功能。 String s="abc 123 abc1234abcabc"; String s1="abc"; int count=0; int index=0; while((index=s. indexOf(s1, index))!=-1){ index+=s1. length; count++; } System. out. println(count); 4、写出使用StringBuffer判断是否为回文串的代码? 5、利用Pattern和Matcher,查找字符串s (“123abcsfs123a1213c34sf32324f243aa45c c99”)中所有有连续数字(出现2次及以上,例如:123)的起始位置和对应的数字字符串。 思考(选做)找到字符串中出现的两位数。 6、购物小票内容如下: 牛奶:89.9元香肠:12.9元啤酒:69元巧克力:132元 要求使用StringTokenizer类,输出购物小票中的价格数据,并计算出菜单的总价格。
05-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值