摘要:如果對于經常改變內容的字符串,使用效率高,但是它只適用于單線程的場景,在多線程場景下,容易導致數據不一致的現象出現。多線程場景下,要使用。在大部分情況下,線程安全的可變字符序列。可將字符串緩沖區安全地用于多個線程。
本人博客 http://www.cnblogs.com/runfor... 總結:
1.String是字符串常量,StringBuffer是線程安全的字符串變量,StringBuilder是直到JDK1.5才加入的線程不安全的字符串變量,之所以設計StringBuilder是為了單線程使用提高效率而考慮的。
2.效率問題,如果對于很少改變內容的字符串,使用string效率高。如果對于經常改變內容的字符串,使用StringBuilder效率高,但是它只適用于單線程的場景,在多線程場景下,容易導致數據不一致的現象出現。多線程場景下,要使用StringBuffer。
**String 類型和 StringBuffer 類型的主要性能區別其實在于String 是不可變的對象, 因此在每次對 String 類型進行改變的時候其實都等同于生成了一個新的 String 對象,然后將指針指向新的 String 對象,所以經常改變內容的字符串最好不要用 String ,因為每次生成對象都會對系統性能產生影響,特別當內存中無引用對象多了以后, JVM 的 GC 就會開始工作,那速度是一定會相當慢的。
而如果是使用 StringBuffer 類則結果就不一樣了,每次結果都會對 StringBuffer 對象本身進行操作,而不是生成新的對象,再改變對象引用。所以在一般情況下我們推薦使用 StringBuffer ,特別是字符串對象經常改變的情況下。而在某些特別情況下, String 對象的字符串拼接其實是被 JVM 解釋成了 StringBuffer 對象的拼接。
String S1 = “This is only a” + “ simple” + “ test”; StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
你會很驚訝的發現,生成 String S1 對象的速度簡直太快了,而這個時候 StringBuffer 居然速度上根本一點都不占優勢。其實這是 JVM 的一個把戲,在 JVM 眼里,這個
String S1 = “This is only a” + “ simple” + “test”; 其實就是:
String S1 = “This is only a simple test”; 所以當然不需要太多的時間了。但大家這里要注意的是,如果你的字符串是來自另外的 String 對象的話,速度就沒那么快了,譬如:**
String S2 = “This is only a”; String S3 = “ simple”; String S4 = “ test”; String S1 = S2 +S3 + S4;
**這時候 JVM 會規規矩矩的按照原來的方式去做。在大部分情況下 StringBuffer > String
StringBuffer,Java.lang.StringBuffer線程安全的可變字符序列。一個類似于 String 的字符串緩沖區,但不能修改。雖然在任意時間點上它都包含某種特定的字符序列,但通過某些方法調用可以改變該序列的長度和內容。可將字符串緩沖區安全地用于多個線程。可以在必要時對這些方法進行同步,因此任意特定實例上的所有操作就好像是以串行順序發生的,該順序與所涉及的每個線程進行的方法調用順序一致。
StringBuffer 上的主要操作是 append 和 insert 方法,可重載這些方法,以接受任意類型的數據。每個方法都能有效地將給定的數據轉換成字符串,然后將該字符串的字符追加或插入到字符串緩沖區中。append 方法始終將這些字符添加到緩沖區的末端;而 insert 方法則在指定的點添加字符。
例如,如果 z 引用一個當前內容是“start”的字符串緩沖區對象,則此方法調用 z.append("le") 會使字符串緩沖區包含“startle”,而 z.insert(4, "le") 將更改字符串緩沖區,使之包含“starlet”。在大部分情況下
StringBuilder > StringBuffer java.lang.StringBuilde
java.lang.StringBuilder一個可變的字符序列是5.0新增的。此類提供一個與StringBuffer 兼容的 API,但不保證同步。該類被設計用作 StringBuffer 的一個簡易替換,用在字符串緩沖區被單個線程使用的時候(這種情況很普遍)。如果可能,建議優先采用該類,因為在大多數實現中,它比 StringBuffer 要快。兩者的方法基本相同。**
StinrgBuilder內部實現機制如下:
public final class StringBuilder extends AbstractStringBuilder; AbstractStringBuilder(int capacity) { value = new char[capacity]; } public StringBuilder() { super(16); //默認2的四次冪 } public StringBuilder(int capacity) { super(capacity); } public StringBuilder(String str) { super(str.length() + 16); append(str); } public StringBuilder append(Object obj) { return append(String.valueOf(obj)); } public StringBuilder append(String str) { super.append(str); return this; }
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66002.html
摘要:事實上,所謂的同步就是指阻塞式操作,而異步就是非阻塞式操作。中可以通過設值注入方法注入和構造器注入實現,推薦使用的方式為設值注入。 寫在前面 春天來了,萬物復蘇的季節到了. 許多程序猿安奈不住生理需求,我要漲工資,我要跳槽. 畢竟金三銀四嘛. 那么要從眾多的面試者中獲得求職機會,我們就要面對很多的面試題. 程序猿是最煩面試題的.面試的公司也煩,面試的人也煩. 但是沒辦法.面試的人魚龍混...
摘要:和它們都是可變的字符串,不過它們之間的區別是初中級面試出現幾率十分高的一道題。區別線程安全線程安全,線程不安全。區別性能既然是線程安全的,它的所有公開方法都是同步的,是沒有對方法加鎖同步的,所以毫無疑問,的性能要遠大于。 StringBuffer 和 StringBuilder 它們都是可變的字符串,不過它們之間的區別是 Java 初中級面試出現幾率十分高的一道題。這么簡單的一道題,棧...
摘要:當然大多數情況下就是我們是在單線程下進行的操作,所以大多數情況下是建議用而不用的,就是速度的原因。 第三階段 JAVA常見對象的學習 StringBuffer和StringBuilder類 (一) StringBuffer類的概述 (1) 基本概述 下文以StringBuffer為例 前面我們用字符串做拼接,比較耗時并且也耗內存(每次都會構造一個新的string對象),而這種拼接操作又...
摘要:的區別是不可變的,如果嘗試去修改,會新生成一個字符串對象,和是可變的是線程安全的,是線程不安全的,所以在單線程環境下效率會更高和有哪些區別首先,他們的底層數據結構不同,底層是基于數組實現的,底層是基于鏈表實現的由于底層 ...
摘要:與都繼承自類,在中也是使用字符數組保存字符串,,這兩種對象都是可變的。采用字節碼的好處語言通過字節碼的方式,在一定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特點。 String和StringBuffer、StringBuilder的區別是什么?String為什么是不可變的? String和StringBuffer、StringBuilder的區別 可變性...
閱讀 2772·2021-11-02 14:42
閱讀 3163·2021-10-08 10:04
閱讀 1184·2019-08-30 15:55
閱讀 1026·2019-08-30 15:54
閱讀 2311·2019-08-30 15:43
閱讀 1680·2019-08-29 15:18
閱讀 863·2019-08-29 11:11
閱讀 2362·2019-08-26 13:52