TShopping

 找回密碼
 註冊
搜索
查看: 179|回復: 0

[教學] Android中String、StringBuffer與StringBuilder的比較

[複製鏈接]
發表於 2016-2-15 23:09:36 | 顯示全部樓層 |閱讀模式
 
Push to Facebook Push to Plurk Push to Twitter 

Java中同時提供String,StringBuffer,StringBuilder三種存放字符串的類型。

String的內容是不可變的,其他二者內容可變。每次給String做一些修改操作時,實際上重新構造了一個String.


按開發文檔的說明,StringBuffer和StringBuilder的最大區別是,StringBuffer所有的訪問都是synchronized,因此是

線程安全的。而StringBuilder則沒有這個特性。StringBuilder在大多數時候能夠替代StringBuffer。


三種由於特性的不同,存在效率上的差異,適合不同應用場景。


java.lang.StringBuffer線程安全的可變字符序列。一個類似於String 的字符串緩衝區,但不能修改。雖然在任意時間點上它都包含某種特定的字符序列,但通過某些方法調用可以改變該序列的長度和內容。可將字符串緩衝區安全地用於多個線程。可以在必要時對這些方法進行同步,因此任意特定實例上的所有操作就好像是以串行順序發生的,該順序與所涉及的每個線程進行的方法調用順序一致。StringBuffer 上的主要操作是append 和insert 方法,可重載這些方法,以接受任意類型的數據。每個方法都能有效地將給定的數據轉換成字符串,然後將該字符串的字符追加或插入到字符串緩衝區中。append 方法始終將這些字符添加到緩衝區的末端;而insert 方法則在指定的點添加字符。
例如,如果z 引用一個當前內容是"start"的字符串緩衝區對象,則此方法調用z.append("le") 會使字符串緩衝區包含"startle",而z.insert(4, "le") 將更改字符串緩衝區,使之包含"starlet"。通常,如果sb 引用StringBuilder 的一個實例,則sb.append(x) 和sb.insert(sb.length(), x) 具有相同的效果。 只要發生有關源序列(如在源序列中追加或插入)的操作,該類就只在執行此操作的字符串緩衝區上而不是在源上實現同步。

每個字符串緩衝區都有一定的容量。只要字符串緩衝區所包含的字符序列的長度沒有超出此容量,就無需分配新的內部緩衝區數組。如果內部緩衝區溢出,則此容量自動增大。從JDK 5開始,為該類補充了一個單個線程使用的等價類,即StringBuilder。與該類相比,通常應該優先使用StringBuilder類,因為它支持所有相同的操作,但由於它不執行同步,所以速度更快。java.lang.StringBuilder一個可變的字符序列。此類提供一個與StringBuffer 兼容的API,但不保證同步。該類被設計用作StringBuffer 的一個簡易替換,用在字符串緩衝區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先採用該類,因為在大多數實現中,它比StringBuffer 要快。在StringBuilder 上的主要操作是append 和insert 方法,可重載這些方法,以接受任意類型的數據。每個方法都能有效地將給定的數據轉換成字符串,然後將該字符串的字符追加或插入到字符串生成器中。append 方法始終將這些字符添加到生成器的末端;而insert 方法則在指定的點添加字符。例如,如果z 引用一個當前內容為“start”的字符串生成器對象,則該方法調用z.append("le") 將使字符串生成器包含“startle”,而z.insert(4, "le") 將更改字符串生成器,使之包含“starlet”。通常,如果sb引用StringBuilder的實例,則sb.append(x)和sb.insert(sb.length(), x)具有相同的效果。每個字符串生成器都有一定的容量。只要字符串生成器所包含的字符序列的長度沒有超出此容量,就無需分配新的內部緩衝區。如果內部緩衝區溢出,則此容量自動增大。將StringBuilder 的實例用於多個線程是不安全的。如果需要這樣的同步,則建議使用StringBufferStringBuffer 類和String 一樣,也用來代表字符串,只是由於StringBuffer 的內部實現方式和String 不同,所以StringBuffer 在進行字符串處理時,不生成新的對象,在內存使用上要優於String 類。
         所以在實際使用時,如果經常需要對一個字符串進行修改,例如插入、刪除等操作,使用StringBuffer 要更加適合一些。
         在StringBuffer 類中存在很多和String 類一樣的方法,這些方法在功能上和String 類中的功能是完全一樣的。
但是有一个最显著的区别在于,对于StringBuffer对象的每次修改都会改变对象自身,这点是和String类最大的区别。
         另外由於StringBuffer 是線程安全的,關於線程的概念後續有專門的章節進行介紹,所以在多線程程序中也可以很方便的進行使用,但是程序的執行效率相對來說就要稍微慢一些。
   1、StringBuffer 對象的初始化
StringBuffer 對象的初始化不像String 類的初始化一樣,Java 提供的有特殊的語法,而通常情況下一般使用構造方法進行初始化。
例如:
         StringBuffer s = new StringBuffer();
這樣初始化出的StringBuffer 對像是一個空的對象。
如果需要創建帶有內容的StringBuffer 對象,則可以使用:
         StringBuffer s = new StringBuffer(“abc”);;
這樣初始化出的StringBuffer 對象的內容就是字符串”abc” 。
需要注意的是,StringBuffer 和String 屬於不同的類型,也不能直接進行強制類型轉換,下面的代碼都是錯誤的:
         StringBuffer s = “abc”; //賦值類型不匹配
         StringBuffer s = (StringBuffer)”abc”; //不存在繼承關係,無法進行強轉
StringBuffer 對象和String 對象之間的互轉的代碼如下:
         String s = “abc”;
         StringBuffer sb1 = new StringBuffer(“123”);
         StringBuffer sb2 = new StringBuffer(s);   //字符串轉換為StringBuffer的
         String s1 = sb1.toString();  //StringBuffer轉換為String

         2、StringBuffer的常用方法
         StringBuffer 類中的方法主要偏重於對於字符串的變化,例如追加、插入和刪除等,這個也是StringBuffer String 類的主要區別。
一,追加方法
       a、append方法
         public StringBuffer append(boolean b)
該方法的作用是追加內容到當前StringBuffer 對象的末尾,類似於字符串的連接。調用該方法以後,StringBuffer 對象的內容也發生改變,例如:
                  StringBuffer sb = new StringBuffer(“abc”);
                   sb.append(true);
         則對象sb 的值將變成”abctrue” 。
使用該方法進行字符串的連接,將比String 更加節約內容,例如應用於數據庫SQL 語句的連接,例如:
                   StringBuffer sb = new StringBuffer();
                   String user = “test”;
                   String pwd = “123”;
sb.append(“select * from userInfo where username=“)
                    .append(user)
                    .append(“ and pwd=”)
                    .append(pwd);
         這樣對象sb 的值就是字符串“select * from userInfo where username=test and pwd=123”。
       b 、deleteCharAt 方法
          public StringBuffer deleteCharAt(int index)
該方法的作用是刪除指定位置的字符,然後將剩餘的內容形成新的字符串。例如:
         StringBuffer sb = new StringBuffer(“Test”);
         sb. deleteCharAt(1);
該代碼的作用刪除字符串對象sb 中索引值為1 的字符,也就是刪除第二個字符,剩餘的內容組成一個新的字符串。所以對象sb 的值變為”Tst” 。
還存在一個功能類似的delete 方法:
         public StringBuffer delete(int start,int end)
該方法的作用是刪除指定區間以內的所有字符,包含start ,不包含end 索引值的區間。例如:
         StringBuffer sb = new StringBuffer(“TestString”);
         sb. delete (1,4);
該代碼的作用是刪除索引值1( 包括) 到索引值4( 不包括) 之間的所有字符,剩餘的字符形成新的字符串。則對象sb 的值是”TString” 。

               Cinsert方法
                            public StringBuffer insert(int offset, boolean b)
                            該方法的作用是在StringBuffer 對像中插入內容,然後形成新的字符串。例如:
                                     StringBuffer sb = new StringBuffer(“TestString”);
                                     sb.insert(4,false);
該示例代碼的作用是在對象sb 的索引值4 的位置插入false 值,形成新的字符串,則執行以後對象sb 的值是”TestfalseString” 。
             dreverse方法
                            public StringBuffer reverse()
該方法的作用是將StringBuffer 對像中的內容反轉,然後形成新的字符串。例如:
         StringBuffer sb = new StringBuffer(“abc”);
         sb.reverse();
經過反轉以後,對象sb 中的內容將變為”cba” 。
                esetCharAt方法
                            public void setCharAt(int index, char ch)
                            該方法的作用是修改對像中索引值為index 位置的字符為新的字符ch 。例如:
                                     StringBuffer sb = new StringBuffer(“abc”);
                                     sb.setCharAt(1,’D’);
                            則對象sb 的值將變成”aDc” 。
             f,trimToSize 方法
                            public void trimToSize()
該方法的作用是將StringBuffer 對象的中存儲空間縮小到和字符串長度一 ​​樣的長度,減少空間的浪費。
         總之,在實際使用時,String 和StringBuffer 各有優勢和不足,可以根據具體的使用環境,選擇對應的類型進行使用。


 

臉書網友討論
您需要登錄後才可以回帖 登錄 | 註冊 |

本版積分規則



Archiver|手機版|小黑屋|免責聲明|TShopping

GMT+8, 2016-12-10 15:06 , Processed in 0.058862 second(s), 22 queries .

本論壇言論純屬發表者個人意見,與 TShopping綜合論壇 立場無關 如有意見侵犯了您的權益 請寫信聯絡我們。

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表