StringBuilder類 一、結構剖析 一個可變的字元序列。此類提供一個與 StringBuffer 相容的 API,但不保證同步(StringBuilder 不是線程安全的)。該類被設計用作 StringBuffer 的一個簡易替換,==用在字元串緩衝區被單個線程使用的時候==。如果可能,建議 ...
StringBuilder類
一、結構剖析
- 一個可變的字元序列。此類提供一個與 StringBuffer 相容的 API,但不保證同步(StringBuilder 不是線程安全的)。該類被設計用作 StringBuffer 的一個簡易替換,用在字元串緩衝區被單個線程使用的時候。如果可能,建議優先採用該類,因為在大多數實現中,它比 StringBuffer要快。
- 在 StringBuilder 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數據。
//StringBuilder類細節:
public class StringBuilder01 {
public static void main(String[] args) {
//1. StringBuilder 繼承 AbstractStringBuilder 類
//2. 實現了 Serializable 介面,說明StringBuilder對象是可以串列化(對象可以網路傳輸,可以保存文件)
//3. StringBuilder 是 final類,不能被繼承
//4. StringBuilder 對象字元序列仍然是存放在其父類 AbstractStringBuilder 的 char[] value;
//5. StringBuilder 的方法,沒有做互斥的處理,即沒有synchronized 關鍵字,因此在單線程的情況下使用StringBuilder
StringBuilder stringBuilder = new StringBuilder();
}
}
二、StringBuilder常用方法
StringBuilder 和 StringBuffer 均代表可變的字元序列,方法是一樣的,所以使用和StringBuffer一樣。
三、StringBuilder應用
-
String、StringBuffer 和 StringBuilder 的比較
-
StringBuilder 和 StringBuffer 非常類似,均代表可變的字元序列,而且方法也一樣
-
String:不可變字元序列,效率低,但是復用率高。
-
StringBuffer:可變字元序列,效率較高(增刪),線程安全。
-
StringBuilder:可變字元序列,效率最高,線程不安全。
-
String使用註意說明:
String s = "a";
:創建了一個字元串s += "b";
:實際上原來的 "a" 字元串對象已經丟棄了,現在又產生了一個字元串 s + "b" (也就是"ab")。如果多次執行這些改變內容的操作,會導致大量副本字元串對象留在記憶體中,降低效率。如果這樣的操作放在迴圈中,會極大影響程式的性能。結論:如果我們對 String 做大量的修改,不要使用String。
-
-
String、StringBuffer和StringBuilder的效率測試
效率:StringBuilder > StringBuffer > String
public class StringVsStringBufferVsStringBuilder { public static void main(String[] args) { long startTime = 0L; long endTime = 0L; StringBuffer buffer = new StringBuffer(""); startTime = System.currentTimeMillis(); for (int i = 0; i < 80000; i++) {//StringBuffer buffer.append(String.valueOf(i)); } endTime = System.currentTimeMillis(); System.out.println("StringBuffer的執行時間:" + (endTime - startTime)); StringBuilder builder = new StringBuilder(""); startTime = System.currentTimeMillis(); for (int i = 0; i < 80000; i++) {//StringBuilder builder.append(String.valueOf(i)); } endTime = System.currentTimeMillis(); System.out.println("StringBuiler的執行時間:" + (endTime - startTime)); String text = ""; startTime = System.currentTimeMillis(); for (int i = 0; i < 80000; i++) {//StringBuilder text = text + i; } endTime = System.currentTimeMillis(); System.out.println("String的執行時間:" + (endTime - startTime)); } } //運行結果: //StringBuffer的執行時間:12 //StringBuiler的執行時間:5 //String的執行時間:3695
-
String、StringBuffer和StringBuilder的選擇
使用原則,結論:
- 如果字元串存在大量的修改操作,一般使用 StringBuffer 或 StringBuilder
- 如果字元串存在大量的修改操作,並且在單線程的情況,使用StringBuileder
- 如果字元串存在大量的修改操作,並且在多線程的情況,使用StringBuffer
- 如果我們字元串很少修改,被多個對象引用,使用String,比如配置信息等