StringBuilder和StringBuffer

可变序列,常用方法,效率探究

Posted by Ruizhi Ma on June 25, 2019

TestStringBuilder类

package commonClass;

/**
 * Test StringBuilder, StringBuffer variable character sequence
 * @author Sober
 *
 */
public class TestStringBuilder {

	public static void main(String[] args) {
		String string;
		
		//StirngBuilder is not thread safe but high efficienct(which is usually used); StringBuffer is thread safe but low efficient.
		StringBuilder sBuilder = new StringBuilder("abcdefg");
		
		System.out.println(Integer.toHexString(sBuilder.hashCode()));
		System.out.println(sBuilder);
	
		//even char is changed but hashcode does not change
		sBuilder.setCharAt(2, 'M');
		System.out.println(Integer.toHexString(sBuilder.hashCode()));
		System.out.println(sBuilder);
		
	}

}

运行结果:

2a139a55
abMdefg

总结

String类型一旦确定就无法改变,任何改变实际上都是重新进行了拷贝和复制;但使用StringBuilder,则是可变的序列。

TestStringBuilder2类

package commonClass;

/**
 * Test StringBuilder and StringBuffer common method
 * @author Sober
 *
 */
public class TestStringBuilder2 {
	public static void main(String[] args) {
		StringBuilder sBuilder = new StringBuilder();
		
		for (int i = 0; i < 26; i++) {
			char temp = (char)('a' + i);
			sBuilder.append(temp);
		}
		
		System.out.println(sBuilder);
		sBuilder.reverse();
		System.out.println(sBuilder);
		sBuilder.setCharAt(4, '马');
		System.out.println(sBuilder);
		sBuilder.insert(0, '马').insert(6, '爱').insert(10, '诺');
		System.out.println(sBuilder);
		
		sBuilder.delete(20, 23);
		System.out.println(sBuilder);
	}
}

运行结果:

abcdefghijklmnopqrstuvwxyz
zyxwvutsrqponmlkjihgfedcba
zyxw马utsrqponmlkjihgfedcba
马zyxw马爱uts诺rqponmlkjihgfedcba
马zyxw马爱uts诺rqponmlkjfedcba

TestStringBuilder3类

package commonClass;

/**
 * Test StringBuilder and StringBuffer traps
 * @author Sober
 *
 */
public class TestStringBuilder3 {

	public static void main(String[] args) {
		//use String to splice charaters
		String string1 = "";
		long num1 = Runtime.getRuntime().freeMemory();
		long time1 = System.currentTimeMillis();
		
		for (int i = 0; i < 5000; i++) {
			string1 = string1 + i;
		}
		
		long num2 = Runtime.getRuntime().freeMemory();
		long time2 = System.currentTimeMillis();
		System.out.println("String occupies memory:" + (num1 - num2));
		System.out.println("String occupied time:" + (time2 - time1));
		
		//use StringBuilder to splice characters
		StringBuilder sBuilder = new StringBuilder("");
		long num3 = Runtime.getRuntime().freeMemory();
		long time3 = System.currentTimeMillis();
		
		for (int i = 0; i < 5000; i++) {
			sBuilder.append(i);
		}
		long num4 = Runtime.getRuntime().freeMemory();
		long time4 = System.currentTimeMillis();
		
		System.out.println("StringBuilder occupied memory:" + (num3 - num4));
		System.out.println("StringBuilder occupied time:" + (time4 - time3));
	
	}

}

运行结果:

String occupies memory:12786760
String occupied time:65
StringBuilder occupied memory:0
StringBuilder occupied time:0

总结

在进行for循环的时候,使用String将会额外开辟非常多的数组,耗时耗空间,但因为StringBuilder是在原字符序列末尾进行了增加,所以空间和时间消耗,大大降低。