String、StringBuilder、StringBuffer的愛恨情仇

第三階段 JAVA常見對象的學習

StringBuffer和StringBuilder類

(一) StringBuffer類的概述

(1) 基本概述

下文以StringBuffer爲例java

前面咱們用字符串作拼接,比較耗時而且也耗內存(每次都會構造一個新的string對象),而這種拼接操做又是比較常見的,爲了解決這個問題,Java就提供了兩個字符串緩衝區類。StringBuffer和StringBuilder供咱們使用。數組

簡單比較:安全

String 長度大小不可變多線程

StringBuffer 長度可變、線程安全、速度較慢app

StringBuilder 長度可變、線程不安全、速度最快學習

-----------------------------------------------------------------------------------------------------------------優化

解釋:ui

  1. 在執行速度方面的比較:StringBuilder > StringBufferthis

  2. StringBuffer與StringBuilder,他們是字符串變量,是可改變的對象,每當咱們用它們對字符串作操做時,其實是在一個對象上操做的,不像String同樣建立一些對象進行操做,因此速度就快了。spa

  3. StringBuilder:線程非安全的

    StringBuffer:線程是安全的(synchronized關鍵字進行修飾)

當咱們在字符串緩衝區被多個線程使用時,JVM不能保證StringBuilder的操做是安全的,雖然他的速度最快,可是能夠保證StringBuffer是能夠正確操做的。固然大多數狀況下就是咱們是在單線程下進行的操做,因此大多數狀況下是建議用StringBuilder而不用StringBuffer的,就是速度的緣由。

對於三者使用的總結:

1.若是要操做少許的數據用 = String 2.單線程操做字符串緩衝區 下操做大量數據 = StringBuilder 3.多線程操做字符串緩衝區 下操做大量數據 = StringBuffer

(2) StringBuffer的構造方法

//無參構造方法
StringBuffer()
    
//指定容量的字符串緩衝區對象
StringBuffer(int size)
    
//指定字符串內容的字符串緩衝區對象
StringBuffer(String str)
複製代碼

(二) StringBuffer 類的功能

(1) 添加功能

//能夠把任意類型添加到字符串緩衝區裏,而且返回字符串緩衝區自己(this)
public StringBuffer append (String str) //在offset位置把任意類型的數據插入到字符串緩衝區中,而且返回字符串緩衝區自己(this) public StringBuffer insert(int offset,String str) 複製代碼

(2) 刪除功能

//刪除指定位置的字符,而且返回自己
public StringBuffer deleteCharAt(int index) //刪除從指定位置開始指定位置結束的內容,而且返回自己 public StringBuffer delete(int start, int end) 複製代碼

(3) 替換功能

//從start到end用str代替
public StringBuffer replace(int start,int end,String str) 複製代碼

(4) 反轉功能

//Eg: 好你界世 → 世界你好
public StringBuffer reverse() 複製代碼

(5) 截取功能

//從start位置開始截取,取之後字符串,但不返回自己,原數據不影響
public String substring(int start) //截取start到end之間的字符串 Publci Stirng substring(int start, int end) 複製代碼

(三) String 和 StringBuffer 類相互轉換

(1) 轉換緣由:

String → StringBuffer 是爲了使用後者的功能

StringBuffer → String 可能須要後者的類型

(2) 轉換方式

※ String → StringBuffer

String s = 「Hello」

//經過構造方法
StringBuffer a = new StringBuffer(s);

//經過append()方法

StringBuffer a = new StringBuffer();
a.append(s);
複製代碼

※ StringBuffer → String

StringBuffer buffer = new StringBuffer(「java」)

//經過構造方法
String str = new String (buffer);

//經過toString()方法
String str = buffer.toString();

複製代碼

(四) 「+」 和 StringBuilder 類的愛恨情仇

首先java並不支持運算符重載。

(String類中的 「+」「+=」是java中僅有的兩個重載過的運算符)

因此咱們能夠經過「+」符號 將多個字符串進行拼接

將這段代碼利用 javap -c filename 反編譯

咱們能夠看到代碼被編譯器自動優化成使用StringBuilder方式拼接

運行效率獲得了保證

img

下面一個案例 數組拼接成指定格式的字符串 代碼中使用了循環語句

//在循環中經過String拼接字符串
public class StringBuilderDemo {
   public static void main(String[] args) {
       String[] arr = {"Hello", "World", "!!!"};
       String s1 = arrayToString(arr);
       System.out.println(s1);
   }

   public static String arrayToString(String[] arr) {
       String s = "";

       s += "[";
       for (int x = 0; x < arr.length; x++) {
           if (x == arr.length - 1) {
               s += arr[x];
           } else {
               s += arr[x];
               s += ", ";
           }
       }
       s += "]";
       return s;
   }
}
//運行結果
[Hello, World, !!!]
複製代碼

使用String方式進行拼接,咱們反編譯能夠看到,StringBuilder被建立在循環的內部,這意味着每循環一次就會建立一次StringBuilder對象,這但是一個糟糕的事情。

img

//在循環中使用StringBuilder拼接字符串
public class StringBuilderDemo2 {
    public static void main(String[] args) {
        String[] arr = {"Hello", "World", "!!!"};
        String s1 = arrayToString(arr);
        System.out.println(s1);
    }

    public static String arrayToString(String[] arr) {
        StringBuilder s = new StringBuilder();
        s.append("[");
        for (int x = 0; x < arr.length; x++) {
            if (x == arr.length - 1) {
                s.append(arr[x]);
            } else {
                s.append(arr[x]);
                s.append(", ");
            }
        }
        s.append("]");
        return s.toString();
    }
}
//運行結果
[Hello, World, !!!]
複製代碼

使用StringBuilder方式進行拼接,反彙編代碼,能夠看到,不只循環部分的代碼更爲簡潔,並且它只生成了一個StringBuilder對象。顯式的建立StringBuilder對象還容許你預先爲其指定大小。能夠避免屢次從新分配緩衝。

總結:

若是字符串操做比較簡單,就可使用「+」運算符操做,編譯器會爲你合理的構造出最終的字符串結果

若是使用循環語句 最好本身手動建立一個StringBuilder對象,用它來構最終結果

結尾:

若是內容中有什麼不足,或者錯誤的地方,歡迎你們給我留言提出意見, 蟹蟹你們 !^_^

若是能幫到你的話,那就來關注我吧!(系列文章均會在公衆號第一時間更新)

在這裏的咱們素不相識,卻都在爲了本身的夢而努力 ❤

一個堅持推送原創Java技術的公衆號:理想二旬不止

img
相關文章
相關標籤/搜索