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 {
// 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);
}
}
}