String、StringBuffer 和 StringBuilder 三者的區別

2024年2月6日 22点热度 0人点赞

String、StringBuffer 和 StringBuilder 區別

String 是不可變的對象, 因此在每次對 String 類型進行改變的時候其實都等同於生成了一個新的 String 對象,然後將指針指向新的 String 對象,效率低下,大量浪費有限的內存空間,每次生成對象都會對系統性能產生影響,效率低。

StringBuffer 每次獲取 toString 都會直接使用緩存區的 toStringCache 值來構造一個字符串。

StringBuilder 則每次都需要復制一次字符數組,再構造一個字符串。

StringBuffer 適用於用在多線程操作同一個StringBuffer 的場景,如果是單線程場合 StringBuilder 更適合。

StringBuffer 同時最多隻有一個線程可以運行這些方法,也就是保證了線程安全。 StringBuilder 沒有線程安全機制,運行起來就不用考慮給線程加鎖,所以運行效率會比 StringBuffer 要高。

StringBuffer是一個容器,長度可變,可以直接操作字符串,用toString方法變為字符串 。

1.存儲

1)append(); //將指定數據加在StringBuffer末尾,返回值也是StringBuffer

StringBuffer sb = new StringBuffer(//可以加str);

StringBuffer sb1=ab.append(數據) //數據可以任何基本數據類型。

2)insert();// 插入

sb.insert(index ,數據);

2.刪除

sb.delete(start ,end); //刪除start到end的字符內容,這裡的所有包含index的操作都是含頭不含尾的

sb.deleteCharAt(index);//刪除指定位置的字符

//清空StringBuffer緩沖區

sb=new StringBuffer();

sb.delete(0,sb.length());

3.獲取

char c = sb.charAt(index);//獲取index上的字符

int i = sb.indexOf(char)://獲取char字符出現的第一次位置

4.修改

sb =sb.replace(start,end,string)//將從start開始到end的字符串替換為string;

sb.setCharAr(index ,char);//將index位置的字符變為新的char

5.反轉 sb.reverse();//將sb倒序

在項目中創建類 Check ,驗證字符串操作和字符串生成器操作的效率。

public class Check{

public static void main ( String [] args ){

String str ="";//創建空字符串

long starTime = System . currentTimeMillis();

//定義對字符串操作的起始時間

for ( int i =0; i <10000; i ){

//利用 for 循環執行10000次操作

str = str i;//循環追加字符串

long endTime = System . currentTimeMillis ();

//定義對字符串操作後的時間

long time=endTime - starTime ;

//計算對字符串執行操作的時間

System . out . println (" String 循環1萬次消耗時間:" time );//將執行的時間輸出

StringBuilder builder = new StringBuilder ("");//創建字符串生成器

starTime = System . currentTimeMillis ();//定義操作執行前的時間

for ( int j =0; j <10000; j ){

builder . append ( j );//循環追加字符

}

endTime = System . currentTimeMillis ();

//定義操作後的時間

time= endTime - starTime;//追加操作執行的時間

System.out. println (" StringBuilder循環1萬次 消耗時間 :" time )://將操作時間輸出

運行結果:String 循環1萬次消耗時間:179

StringBuilder 循環1萬次消耗時間:0

StringBuffer 、 StringBuilder 、 String 的區別

String 對象類型:字符串常量,線程不安全,執行效率低。

StringBuilder 對象類型:字符串常量,線程不安全,執行效率高。

StringBuffer 對象類型:字符串常量,線程安全,執行效率中等。

StringBuffer 、 StringBuilder 、 String 類的適用場合:

(1)操作少、數據少,用 String 。

(2)單線程,操作多,數據多,用StringBuilder 。

(3)多線程,操作多,數據多,用 StringBuffer。簡單的字符串修改時,時間非常快,三者區別不大,隻有在大量的字符串修改時,才會顯示出 StringBuffer 和 StringBuilder 的優勢。

StringBuilder語句