1. 程式人生 > >String,StringBuilder,StringBuffer的區別?

String,StringBuilder,StringBuffer的區別?

1.執行速度,在這方面執行速度快慢為:StringBuilder >StringBuffer >String
String 最慢的原因:

String 為字串常量,而StringBuilder 和 StringBuffer 均為字串變數,即 String 物件一旦建立之後該物件是不可更改的,但後兩者的物件是變數,是可以更改的。

2.執行緒安全
線上程安全上,StringBuilder 是執行緒不安全的,而 StringBuilder 是執行緒安全的 (StringBuffer 中很多方法可以帶有synchronized 關鍵字)

3.總結一下
String:適用於少量的字串操作的情況;
StringBuilder:適用於單執行緒下載字元緩衝區進行大量操作的情況;
StringBuffer:適用多執行緒下在字元緩衝區進行大量操作的情況;
結合 jdk 的原始碼檢視

參考程式碼: StringBuTest

// String,StringBuilder,StringBuffer簡單使用測試
public class StringBuTest {

	public static void main(String[] args) {
		String s1 = "233";
		s1 = s1 + "wwww";
		System.out.println(s1);

		StringBuilder sbd = new StringBuilder();
		sbd.append("StringBuilder").append("12").append("34").append("56");
		System.out.println("StringBuilder:" + sbd.toString());

		StringBuffer sbf = new StringBuffer();
		sbf.append("stringbuffer").append("12").append("34").append("56");
		System.out.println("StringBuffer:" + sbf.toString());

		StringBuilder sb = new StringBuilder("1111199999");
		StringBuffer sbffer = new StringBuffer("1111199999");

		// 下面是驗證執行緒安全的測試
		// 迴圈建立多個執行緒,測試StringBuilder
//		for (int i = 0; i < 100; i++) {
//			new Thread(new MyThread(sb)).start();
//		}
		
		// 迴圈建立多個執行緒,測試StringBuffer
		for (int i = 0; i < 100; i++) {
			new Thread(new MyThreadSbf(sbffer)).start();
		}
	}

	private static class MyThread implements Runnable {
		// 定義成員屬性
		private StringBuilder sb;

		// 建構函式,引數初始化
		private MyThread(StringBuilder sb) {
			this.sb = sb;
		}

		public void run() {
			// 迴圈可以增加出現執行緒不安全的情況
			for (int i = 0; i < 100; i++) {
				sb.reverse();
			}
			// 輸出sb字串(預設呼叫了toString())
			System.out.println(sb);
		}
	}
	
	private static class MyThreadSbf implements Runnable {
		// 定義成員屬性
		private StringBuffer sb;

		// 建構函式,引數初始化
		private MyThreadSbf(StringBuffer sb) {
			this.sb = sb;
		}

		public void run() {
			// 迴圈可以增加出現執行緒不安全的情況發生
			for (int i = 0; i < 100; i++) {
				sb.reverse();
			}
			// 輸出sb字串(預設呼叫了toString())
			System.out.println(sb);
		}
	}
}