java基础:string与stringBuilder性能比较

字符串的操作经常用到,什么时候用String,什么时候用StringBuilder呢?比较一下常用操作的性能。

通常的字符串操作无非是叠加和截断。

先来看截断,即indexOf和subString的性能:

		String str = "name=shoren";
		StringBuilder sb = new StringBuilder(str);
		long t1 = System.currentTimeMillis();		
		for(int i=0; i<10000; i++){
			int index = str.indexOf("=");
			str.substring(0, index);
			str.substring(index+1);
		}
		long t2 = System.currentTimeMillis();
		System.out.println("str : " + (t2 - t1));
		t1 = System.currentTimeMillis();		
		for(int i=0; i<10000; i++){
			int index = sb.indexOf("=");
			sb.substring(0, index);
			sb.substring(index+1);
		}
		t2 = System.currentTimeMillis();
		System.out.println("sb : " + (t2 - t1));
结果为:

str : 2
sb : 4

在截断时StringBuilder的性能要差一些,可以看jdk源代码,发现StringBuilder的subString操作中调用的new String的构造函数要复杂一些。代码就略过了。


再来看叠加:

		String factor = "x";
		String str = "name=shoren";
		StringBuilder sb = new StringBuilder(str);
		long t1 = System.currentTimeMillis();		
		for(int i=0; i<10000; i++){
			str += "x" + factor;
		}
		long t2 = System.currentTimeMillis();
		System.out.println("str : " + (t2 - t1));
		t1 = System.currentTimeMillis();		
		for(int i=0; i<10000; i++){
			sb.append("x" + factor);
		}
		t2 = System.currentTimeMillis();
		System.out.println("sb : " + (t2 - t1));
		
		t1 = System.currentTimeMillis();		
		for(int i=0; i<10000; i++){
			sb.append("x");
			sb.append(factor);
		}
		t2 = System.currentTimeMillis();
		System.out.println("sb : " + (t2 - t1));
结果为:

str : 178
sb : 3
sb : 1

可见,在叠加操作的时候,两者差别还是蛮大的。

sb的两种情况有差别,因为sb.append("x" + factor);中的"x" + factor先做了一次string放入叠加,没有sb的append快。




你可能感兴趣的:(java)