天天看點

java中String、StringBuffer、StringBuilder的差別

<b>閱讀目錄</b>

<a href="http://www.cnblogs.com/kaituorensheng/p/8168024.html#_label0">0. 不當用法</a>

<a href="http://www.cnblogs.com/kaituorensheng/p/8168024.html#_label1">1. String類封裝的字元串是不可變的</a>

<a href="http://www.cnblogs.com/kaituorensheng/p/8168024.html#_label2">2. 如何做到封裝數組可變</a>

<a href="http://www.cnblogs.com/kaituorensheng/p/8168024.html#_label3">3. StringBuilder與StringBuffer 差別</a>

<a href="http://www.cnblogs.com/kaituorensheng/p/8168024.html#_label4">4. 使用場景</a>

<a href="http://www.cnblogs.com/kaituorensheng/p/8168024.html#_label5">5. 總結</a>

java中String、StringBuffer、StringBuilder的差別

Java裡面提供了String,StringBuffer和StringBuilder三個類來封裝字元串

不要使用String類的"+"來進行頻繁的拼接,因為那樣的性能極差的,應該使用StringBuffer或StringBuilder類,這在Java的優化上是一條比較重要的原則

字元串是由若幹個字元線性排列組成的,String類的關鍵源碼如下

<a></a>

因為有“final”修飾符,是以可以String類封裝的字元串是不可變的。那麼增删改是怎麼實作的呢?下面是字元串截取的關鍵源碼

可以看到截取源碼是生成了一個新的String對象傳回的。

是以,在對String類型的字元串進行大量“插入”和“删除”操作時會産生大量的臨時變量。

既然String類封裝的字元串是不可變的,那麼是否應該有一個類來封裝可變數組。答案是有的,StringBuilder與StringBuffer封裝類都是可變的。

StringBuilder與StringBuffer都繼承自AbstractStringBuilder抽象類,在AbstractStringBuilder中也是使用字元數組儲存字元串,其關鍵代碼如下

StringBuffer類實作代碼如下

可以看到StringBuffer建立字元串對象預設的大小是16,當然也可以傳入數組大小。

下面列下StringBuffer的用法

輸出

1

<code>hello world</code>

下面看源碼分析下append函數,來看下如何做到長度可變

可以看到空間擴充室友copyOf函數實作:

AbstractStringBuilder是StringBuilder與StringBuffer的公共父類,定義了一些字元串的基本操作,如expandCapacity、append、insert、indexOf等公共方法,StringBuilder和StringBuffer的方法實作基本上一緻,不同的是StringBuffer類的方法前多了個synchronized關鍵字,即StringBuffer是線程安全的。

(1)append,insert,delete方法最根本上都是調用System.arraycopy()這個方法來達到目的

(2)substring(int, int)方法是通過重新new String(value, start, end - start)的方式來達到目的。是以,在執行substring操作時,StringBuilder和String基本上沒什麼差別。

如果是多線程環境下涉及到共享變量的插入和删除操作,StringBuffer則是首選。如果是非多線程操作并且有大量的字元串拼接,插入,删除操作則StringBuilder是首選。畢竟String類是通過建立臨時變量來實作字元串拼接的,耗記憶體還效率不高,怎麼說StringBuilder是通過JNI方式實作終極操作的。

String類型的字元串對象是不可變的,一旦String對象建立後,包含在這個對象中的字元系列是不可以改變的,直到這個對象被銷毀。

StringBuilder和StringBuffer類型的字元串是可變的,不同的是StringBuffer類型的是線程安全的,而StringBuilder不是線程安全的

如果是多線程環境下涉及到共享變量的插入和删除操作,StringBuffer則是首選。如果是非多線程操作并且有大量的字元串拼接,插入,删除操作則StringBuilder是首選。

如果要操作少量的資料,用String;單線程操作大量資料,用StringBuilder;多線程操作大量資料,用StringBuffer。

本文轉自jihite部落格園部落格,原文連結:http://www.cnblogs.com/kaituorensheng/p/8168024.html,如需轉載請自行聯系原作者