首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 中 String 與 StringBuffer 差異深度解析

     編輯:Java 相關知識

核心差異總覽

Java 中三個類別負責字元操作:

  1. Character:單一字元操作
  2. String:字串操作,不可變類別
  3. StringBuffer:字串操作,可變類別

String 特性

  • 是物件非原始型別
  • 不可變物件,一旦建立無法修改值
  • 修改操作實為重新建立新物件,保存新值
  • final 類別,不可被繼承

StringBuffer 特性

  • 可變物件,修改時不像 String 重新建立物件
  • 只能透過建構函數建立:StringBuffer sb = new StringBuffer();
  • 不可用指派運算子:sb = "welcome!"; // 錯誤
  • 建立後記憶體分配空間,初始保存 null,透過 append() 賦值:sb.append("hello");

效能比較:字串連接操作

StringBuffer 效率遠高於 String:

String str = new String("welcome to ");
str += "here";

實際處理步驟:建立 StringBuffer → 呼叫 append() → toString()。String 連接多出額外操作,效能打折。且 String 不可變,每次操作重建新物件,舊物件成為垃圾回收對象,影響效能。

實測程式碼與結果

將 26 個英文字母重複加 5000 次:

String 版本

String tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart1 = System.currentTimeMillis();
String str = "";
for (int i = 0; i < times; i++) {
    str += tempstr;
}
long lend1 = System.currentTimeMillis();
System.out.println(lend1 - lstart1);

結果:約 46,687 ms(46 秒)

StringBuffer 版本

String tempstr = "abcdefghijklmnopqrstuvwxyz";
int times = 5000;
long lstart2 = System.currentTimeMillis();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < times; i++) {
    sb.append(tempstr);
}
long lend2 = System.currentTimeMillis();
System.out.println(lend2 - lstart2);

結果:16 ms 或 0 ms

結論:StringBuffer 速度幾乎是 String 上萬倍。迴圈 100,000 次差異更大。

原理說明

str += "here"; 等同於:

StringBuffer sb = new StringBuffer(str);
sb.append("here");
str = sb.toString();

直接用 + 連接 String 等同於每次迴圈新建 StringBuffer、append、toString,效能極差。

總結

程式中需頻繁修改連接字串操作時,使用 StringBuffer 效能更高。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved