String、StringBuffer、StringBuffer类的区别

1.String类:

String类时不可变的,这就导致每次对String的操作都会产生新的String对象,效率低,也浪费内存。

如:String str = "lzm":这时str在内存中占了一个位置假设为:ox10001。

str = "xjp":把"xjp"赋给str后,str就指向了新的地址假设为ox10002,但是内存中ox10001的地址依然保存着"lzm",但是str已经指向了其他的内存地址,这就导致了这块内存地址的浪费。


2.StringBuffer类:

StringBuffer是可变类,也是线程安全的,任何对它指向的字符串操作都不会产生新的对象,每个StringBuffer对象都会有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量。


3.StringBuilder类:

StringBuilder类时可变类,它和StringBuffer基本类似,主要的区别在于StringBuffer是线程安全的,而StringBuilder不是线程安全的,可以得出支持线程安全就会导致程序性能降低的问题。


4.速度的比较:

在单线程的情况下:StringBuilder的速度快于StringBuffer,String的速度最慢!


下面我们通过一个例子来比较在单线程的情况下他们三者的速度:

public class StringTest {
	
	public static void main(String[] args) {
	
		/*程序开始时间*/
		long startTime = System.currentTimeMillis();
		/*运行逻辑代码*/
		//StringTest();
		//StringBufferTest();
		StringBuilderTest();
		/*程序结束时间*/
		long endTime = System.currentTimeMillis();
		
		System.out.println("运行时间:" + (endTime - startTime));
	}

	/**
	 * 测试String的运行速度
	 */
	public static void StringTest(){
		
		String str = new String("lzm");
		
		for (int i=0; i<60000; i++){
			str += " hello";
		}
	}
	
	/**
	 * 测试StringBuffer的运行速度
	 */
	public static void StringBufferTest(){
		StringBuffer str = new StringBuffer("lzm");
		
		for (int i=0; i<60000; i++){
			str.append(" hello");
		}
	}
	/**
	 * 测试StringBuilder的运行速度
	 */
	public static void StringBuilderTest(){
		
		StringBuilder str = new StringBuilder("lzm");
		
		for (int i=0; i<60000; i++){
			str.append(" hello");
		}
	}
}

程序打印的结果为:

String的运行时间:10270ms。

StringBuffer的运行时间:20ms。

StringBuilder的运行时间:15ms。


总结:

1:如果只是操作很少量的字符串建议使用String。

2:如果是在单线程下操作大量数据建议使用StringBuilder【非线程安全】。

3:如果在多线程下操作大量数据建议使用StringBuffer【线程安全】。

你可能感兴趣的:(String,StringBuilder,StringBuffer,线程安全导致性能降低)