1. 程式人生 > 其它 >Stringbuffer和Stringbuilder區別

Stringbuffer和Stringbuilder區別

StringBuilder / StringBuffer
–1,概述
專門優化字串拼接
–2,建立物件
StringBuilder()
構造一個不帶任何字元的字串生成器,其初始容量為 16 個字元。
–3,常用方法
StringBuilder append(String str)
將指定的字串追加到此字元序列。
–4,測試
package cn.tedu.api;
//測試 字串拼接
//1,工具類的使用場景:當有大量的字串拼接需求時
//2,使用步驟: 先建立物件 ,然後呼叫append()追加
//3,效能: 工具類拼接 > +號拼接
//4,為什麼+拼接字串慢?–因為字串是一個常量,一旦建立不能改變
public class Test4_StringBuilder {

public static void main(String[] args) {
// method();//+拼接
method2();//StringBuilder拼接
}
public static void method2() {
//把指定的字串拼接10000次
String s = “abcdefghijklmnopqrstuvwxyz” ;
// StringBuilder sb = new StringBuilder();
StringBuffer sb = new StringBuffer();

			long start = System.currentTimeMillis();//計時開始
			for (int i = 0; i < 10000; i++) {
				sb.append(s) ;//工具拼接
			}
			long end = System.currentTimeMillis();//計時結束
			
			System.out.println(end-start);//1ms
		}
		//+拼接
		public static void method() {
			//把指定的字串拼接10000次
			String s = "abcdefghijklmnopqrstuvwxyz" ;
			String res = "" ;//定義變數,記錄結果
			
			long start = System.currentTimeMillis();//計時開始
			for (int i = 0; i < 10000; i++) {
				res = res + s ;//+拼接慢
			}
			long end = System.currentTimeMillis();//計時結束
			
			System.out.println(end-start);//1372ms
		}
	}

區別1:執行緒安全
StringBuffer:執行緒安全,StringBuilder:執行緒不安全。因為 StringBuffer 的所有公開方法都是 synchronized 修飾的,而 StringBuilder 並沒有 StringBuilder 修飾。

StringBuffer 程式碼片段:

@Override
public synchronized StringBuffer append(String str) {
toStringCache = null;
super.append(str);
return this;
}

區別2:緩衝區
StringBuffer 程式碼片段:

private transient char[] toStringCache;

@Override
public synchronized String toString() {
if (toStringCache == null) {
toStringCache = Arrays.copyOfRange(value, 0, count);
}
return new String(toStringCache, true);
}

StringBuilder 程式碼片段:
@Override
public String toString() {
// Create a copy, don’t share the array
return new String(value, 0, count);
}
可以看出,StringBuffer 每次獲取 toString 都會直接使用快取區的 toStringCache 值來構造一個字串。

而 StringBuilder 則每次都需要複製一次字元陣列,再構造一個字串。

所以,快取衝這也是對 StringBuffer 的一個優化吧,不過 StringBuffer 的這個toString 方法仍然是同步的。

區別3:效能
既然 StringBuffer 是執行緒安全的,它的所有公開方法都是同步的,StringBuilder 是沒有對方法加鎖同步的,所以毫無疑問,StringBuilder 的效能要遠大於 StringBuffer。

總結
所以,StringBuffer 適用於用在多執行緒操作同一個 StringBuffer 的場景,如果是單執行緒場合 StringBuilder 更適合。

三,String
–1,概述
String 類代表字串。Java 程式中的所有字串字面值(如 “abc” )都作為此類的例項實現。
字串是常量;它們的值在建立之後不能更改。
–2,特點
–原始碼摘抄:
–public final class String --不能被繼承
–private final char value[];–字串是常量
–3,建立物件
String(char[] value)
–4,常用方法
char charAt(int index)
返回指定索引處的 char 值。
String concat(String str)
將指定字串連線到此字串的結尾。
boolean endsWith(String suffix)
測試此字串是否以指定的字尾結束。
boolean equals(Object anObject)
將此字串與指定的物件比較。
byte[] getBytes()
int hashCode()
返回此字串的雜湊碼。
int indexOf(String str)
返回指定子字串在此字串中第一次出現處的索引
int lastIndexOf(String str)
返回指定子字串在此字串中最右邊出現處的索引。
boolean isEmpty()
當且僅當 length() 為 0 時返回 true。
int length()
返回此字串的長度。
String replace(char oldChar, char newChar)
返回一個新的字串,它是通過用 newChar 替換此字串中出現的所有 oldChar 得到的。
String[] split(String regex)
根據給定正則表示式的匹配拆分此字串。
boolean startsWith(String prefix)
測試此字串是否以指定的字首開始。
String substring(int beginIndex)
返回一個新的字串,它是此字串的一個子字串。
String substring(int beginIndex, int endIndex)
返回一個新字串,它是此字串的一個子字串。
char[] toCharArray()
將此字串轉換為一個新的字元陣列。
String toLowerCase()
String toUpperCase()
String trim()
返回字串的副本,忽略前導空白和尾部空白。
static String valueOf(int i)
返回 int 引數的字串表示形式。
–5,測試
package cn.tedu.api;

	import java.util.Arrays;

	//測試 String工具類
	public class Test3_String {
		public static void main(String[] args) {
			//1,建立String物件
			char[] cs = {'a','b','c','a'};
			String str = new String(cs);//觸發String(char[] value) 
			
			String str2 = "abcdefabc" ;//相當於簡寫形式
			//2,呼叫方法
			System.out.println( str.charAt(2) );//根據下標2,獲取對應的字元
			System.out.println( str.concat("xyz") );//拼接字串
			System.out.println( str.endsWith("abc"));//判斷是否以指定資料結尾
			System.out.println( str.equals("abca"));//判斷兩個字串的內容是否相同
			
			System.out.println("--------------");
			
			System.out.println( str.hashCode() );//計算雜湊碼值
			System.out.println( str.indexOf("a") );//獲取第一次出現的索引值
			System.out.println( str.lastIndexOf("a") );//獲取最後一次出現的索引值
			System.out.println( str.isEmpty() );//判斷字串是否為空
			System.out.println( str.length() );//獲取字串的長度
			
			System.out.println("--------------");
			
			System.out.println( str.replace('a','x')  );//把舊字元換成新字元
			System.out.println( str.startsWith("ab")  );//判斷是否以指定內容開始
			//擷取字串,從指定位置開始到末尾處
			System.out.println( str.substring(2) );
			//擷取字串,從1開始,到3結束,含頭不含尾[1,3)
			System.out.println( str.substring(1,3) );
			System.out.println( str.toLowerCase()   );//全轉小寫
			System.out.println( str.toUpperCase()   );//全轉大寫
			
			str = "   abc 1  23     " ;
			System.out.println( str.trim()   );//去除前導和後導多餘的空格
			
			System.out.println("--------------");
			
			String s = String.valueOf(10);//把指定的數字10轉成字串
			System.out.println(s+1);//101,字串拼接
			
			char[] css = str.toCharArray();//把字串的資料存入char[]
			System.out.println(css);
			
			byte[] bs = str.getBytes() ;//把字串的資料,轉成整數並存入byte[]
			System.out.println( Arrays.toString(bs) );
			
	//		String[] split(String regex) 
			str = "a1b1c1d1" ;
			String[] ss = str.split("1") ;//按照指定的字串切割字串
			System.out.println( Arrays.toString(ss) );//[a, b, c, d]
			//TODO 列印字串裡的每個字元-----------------
			char[] a = str.toCharArray() ;
			for (int i = 0; i < a.length; i++) {//遍歷char[]陣列
				System.out.println(a[i]);//根據下標獲取資料
			}
			for(int i = 0; i < str.length() ;i++) {//遍歷字串
				char c = str.charAt(i);//根據下標獲取字元
				System.out.println(c);
			}
		}

	}