【黑马程序员】Java基础06:StringBuffer和StringBuilder的效率与安全性

---------------------- ASP.Net+Android+IOS开发、 .Net培训、期待与您交流! ----------------------


一、StringBuffer的特点

1、它是字符串缓冲区,是一个容器对象;

2、它的长度是可变类,任何对它所指代的字符串的改变都不会产生新的对象

3、可以直接操作多个数据类型,最终会通过toString方法变成字符串。

 

二、StringBuilder的特点

JDK1.5以后,字符串缓冲区又多出一个对象,这就是StringBuilder类。

查阅StringBuilder的方法可知,它几乎和StringBuffer完全一致,那为什么要多出一个类呢?

 

仔细阅读API,有如下描述:

1、该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer要快;

2、将 StringBuilder的实例用于多个线程是不安全的,如果需要这样的同步,则建议使用 StringBuffer

 

三、通过代码验证:StringBufferStringBuilder的效率

package blog.itheima;

//StringBuffer和StringBuilder的效率比较
public class StringBufBuildEfficientCompare {

	public static void main(String[] args) {
		int count = 5000000;
		stringBuf(count);
		stringBuild(count);
		
		stringBuf("abc",count);
		stringBuild("abc",count);
	}

	//在StringBuffer中添加int数据
	public static void stringBuf(int count){
		StringBuffer sbuf = new StringBuffer();
		long startTime = System.currentTimeMillis();
		for(int i=1; i<=count; i++){
			//append(int i) 将 int 参数的字符串表示形式追加到此序列
			sbuf.append(i);
			//如果循环的是11,是表示二个元素,100为三个元素
		}
		System.out.println("StringBuffer中有"+sbuf.length()+"个元素,运行耗时:"+(System.currentTimeMillis()-startTime)+"毫秒");
	}
	
	//重载,在StringBuffer中加入String数据
	public static void stringBuf(String test,int count){
		StringBuffer sbuf = new StringBuffer();
		long startTime = System.currentTimeMillis();
		for(int i=1; i<=count; i++){
			sbuf.append(test);
		}
		System.out.println("StringBuffer中有"+sbuf.length()+"个元素,运行耗时:"+(System.currentTimeMillis()-startTime)+"毫秒");
	}
	
	//在StringBuilder中添加int数据
	public static void stringBuild(int count){
		StringBuilder sbuild = new StringBuilder();
		long startTime = System.currentTimeMillis();
		for(int i=1; i<=count; i++){
			sbuild.append(i);
		}
		System.out.println("StringBuilder中有"+sbuild.length()+"个元素,运行耗时:"+(System.currentTimeMillis()-startTime)+"毫秒");
	}
	
	//重载,在StringBuilder中加入String数据
	public static void stringBuild(String test,int count){
		StringBuilder sbuild = new StringBuilder();
		long startTime = System.currentTimeMillis();
		for(int i=1; i<=count; i++){
			sbuild.append(test);
		}
		System.out.println("StringBuilder中有"+sbuild.length()+"个元素,运行耗时:"+(System.currentTimeMillis()-startTime)+"毫秒");
	}	
	
/*	打印结果如下:说明在单线程中,StringBuilder比StringBuffer效率更高。
	StringBuffer中有33888896个元素,运行耗时:368毫秒
	StringBuilder中有33888896个元素,运行耗时:271毫秒
	StringBuffer中有15000000个元素,运行耗时:217毫秒
	StringBuilder中有15000000个元素,运行耗时:123毫秒
 	*/
}

四、通过代码验证:StringBufferStringBuilder的安全性

package blog.itheima;

import java.util.Random;
//StringBuffer和StringBuilder多线程的安全测试

public class StringBufBuildSafetyCompare2 {
	
	public static void main(String[] args) {
		StringBuffer stringBuffer = new StringBuffer();
		StringBuilder stringBuilder = new StringBuilder();
		
		final int N = 1000; 
		for (int i = 0; i<5; i++) {
			//每次循环时,都要删除StringBuffer和StringBuilder中的数据,否则上次存储的数据会一直积累下去。
			stringBuilder.delete(0, stringBuilder.length()); 
			stringBuffer.delete(0, stringBuffer.length()); 
			
			int bufferLength = test(stringBuffer, N); 
			int builderLength = test(stringBuilder, N); 
			
			System.out.println("StringBuffer/StringBuilder: " 
									+ bufferLength + "/" + builderLength); 
		}
	}
	
    public static int test(final Object string, int n) {

        for (int i=0; i

五、对比与总结:

1、从上面的结果来看,在单线程中采用StringBuffer和采用StringBuilder的差别比较明显,前者是后者的1.5倍左右。由此可见,如果我们的程序是在单线程下运行,或者是不必考虑到线程同步问题,应该优先使用StringBuilder类;

2如果要保证线程安全,必须用StringBuffer


---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

你可能感兴趣的:(【黑马程序员】Java基础06:StringBuffer和StringBuilder的效率与安全性)