String stringBuffer StringBuilder的區別

一 三者的繼承結構
在這裏插入圖片描述
三者的區別:
String :不可變字符串在 Java 中字符串屬於對象,Java 提供了 String 類來創建和操作字符串。
StringBuffer:可變字符串 效率低 線程安全
StringBuilder:可變字符序列 效率高 線程不安全**
需要注意的是,String的值是不可變的,這就導致每次對String的操作都會生成新的String對象,這樣不僅效率低下,而且大量浪費有限的內存空間。

當對字符串進行修改的時候,需要使用 StringBuffer 和 StringBuilder 類。

和 String 類不同的是,StringBuffer 和 StringBuilder 類的對象能夠被多次的修改,並且不產生新的未使用對象。
StringBuilder 類在 Java 5 中被提出,它和 StringBuffer 之間的最大不同在於 StringBuilder 的方法不是線程安全的(不能同步訪問)。

由於 StringBuilder 相較於 StringBuffer 有速度優勢,所以多數情況下建議使用 StringBuilder 類。然而在應用程序要求線程安全的情況下,則必須使用 StringBuffer 類。

**
**
1)如果要操作少量的數據用 String;
(2)多線程操作字符串緩衝區下操作大量數據 StringBuffer;
(3)單線程操作字符串緩衝區下操作大量數據 StringBuilder(推薦使用)。

三、StringBuilder類在Android中運用示例
(1)上官方文檔,StringBuilder,A mutable sequence of characters. This class provides an API compatible with StringBuffer, but with no guarantee of synchronization. This class is designed for use as a drop-in replacement for StringBuffer in places where the string buffer was being used by a single thread (as is generally the case). Where possible, it is recommended that this class be used in preference to StringBuffer as it will be faster under most implementations.

The principal operations on a StringBuilder are the append and insert methods, which are overloaded so as to accept data of any type. Each effectively converts a given datum to a string and then appends or inserts the characters of that string to the string builder. The append method always adds these characters at the end of the builder; the insert method adds the characters at a specified point.

參考網址:https://developer.android.google.cn/reference/java/lang/StringBuilder.html

由上面的官方文檔,我們知道以下幾點:

一個可變的字符序列。StringBuilder類提供一個與StringBuffer兼容的API,但不保證同步。該類被設計用作StringBuffer的一個簡單替換,用在字符串緩衝區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因爲在大多數實現種,它比StringBuffer要快。

在StringBuilder上的主要操作時append和insert方法,可重載這些方法,以接收任意類型的數據。每個方法都能有效地將給定的數據轉換成字符串,然後將該字符串的字符追加或插入到字符串生成器中,append方法始終將這些字符添加到生成器的末端,而insert方法則在指定的點添加字符。

例如,如果z引用一個當前內容爲“start”的字符串的生成器對象,則該方法調用z.append(“le”)將使字符串生成器包含“startle”,而z.insert(4,“le”)將更改字符串生成器,使之包含“startlet”。

通常,如果sb引用StringBuilder的實例,則sb.append(x)和sb.insert(sb.length(),x)具有相同的效果。每個字符串生成器都有一定的容量,只要字符串生成器包含的字符序列的長度沒有超出此容量,就無需分配新的內容緩衝區。如果內容緩衝區溢出,則此容量自動增大。

將StringBuilder的實例用於多個線程是不安全的。如果需要這樣的同步,則建議使用StringBuffer。

(2)上代碼,具體實現

new Thread(new Runnable){
@Override
public void run(){
HttpURLConnection connection = null;
BufferedReader reader = null;
try{
URL url = new URL(“http://www.baidu.com”);
connection = (HttpURLConnection)url.openConnection();
connnection.setRequestMethod(“GET”);
InputStream in = connection.getInputStream();
//下面對獲取到的輸入流進行讀取
reader= new BufferedReader(new InputStreamReader(in));
StringBuilder response = new(StringBuilder());
String line;
While ((line =reader.readLine())!= null ){
response.appen d(line));
}
showResponse(reponse.toString())
}
}…

}

上段代碼模擬的是向百度網請求數據,然後對網站返回的數據流進行讀取,最終應用StringBuilder()進行字符串數據的讀取和顯示。

總結:末尾總是有福利,三者區別可參照下表:

String StringBuffer StringBuilder
String的值是不可變的,這就導致每次對String的操作都會生成新的String對象,不僅效率低下,而且浪費大量優先的內存空間 StringBuffer是可變類,和線程安全的字符串操作類,任何對它指向的字符串的操作都不會產生新的對象。每個StringBuffer對象都有一定的緩衝區容量,當字符串大小沒有超過容量時,不會分配新的容量,當字符串大小超過容量時,會自動增加容量 可變類,速度更快
不可變 可變 可變
線程安全 線程不安全
多線程操作字符串 單線程操作字符串

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章