StringBuilder
StringBuilder是可變字符串類型,它被人所熟知的功能就是可以很方便的對字符串進行拼接、構造:
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence
方法是 final的,繼承了 AbstractStringBuilder抽象類:
abstract class AbstractStringBuilder implements Appendable, CharSequence { char[] value; int count; ... }
可以看到它實現了 Appendable接口,而 Appendable接口就是提供了可以被添加char序列和值的功能,它實現了三種 append方法:
Appendable append(CharSequence csq) throws IOException; Appendable append(CharSequence csq, int start, int end) throws IOException; Appendable append(char c) throws IOException;
其中 CharSequence是 char值的可讀序列,此接口對許多不同種類的 char 序列提供統一的只讀訪問, String StringBuilder StringBuffer都實現了這個接口:
int length(); char charAt(int index); CharSequence subSequence(int start, int end);
在 AbstractStringBuilder抽象類中,提供了一系列的 append和 insert方法的實現,下面是其中一種實現:
public AbstractStringBuilder append(String str) { if (str == null) str = "null"; //如果為空,則添加null字符串 int len = str.length(); ensureCapacityInternal(count + len);//保證容量 //復制str字符串到char數組value,從count位開始添加 str.getChars(0, len, value, count); count += len; return this; }
private void ensureCapacityInternal(int minimumCapacity) { // overflow-conscious code if (minimumCapacity - value.length > 0) expandCapacity(minimumCapacity); }
如果傳遞的最小容量大于現有容量,則必須進行擴容:
void expandCapacity(int minimumCapacity) { //新容量為old*2+2 int newCapacity = value.length * 2 + 2; if (newCapacity - minimumCapacity < 0) newCapacity = minimumCapacity; if (newCapacity < 0) { if (minimumCapacity < 0) // overflow throw new OutOfMemoryError(); newCapacity = Integer.MAX_VALUE; } value = Arrays.copyOf(value, newCapacity); }
注意: AbstractStringBuilder中的方法實現都沒有進行同步
insert方法:
public AbstractStringBuilder insert(int offset, String str) { if ((offset < 0) || (offset > length())) throw new StringIndexOutOfBoundsException(offset); if (str == null) str = "null"; int len = str.length(); ensureCapacityInternal(count + len); System.arraycopy(value, offset, value, offset + len, count - offset); str.getChars(value, offset); count += len; return this; }StringBuffer
StringBuffer類的出現實際上比 StringBuilder要早,當初提供 StringBuilder類只是為了提供一個單個線程使用的 StringBuffer等價類。如果觀察 StringBuffer的源代碼,可以發現它的方法和 StringBuilder相同,只不過都加上了 synchronized ,比如:
public synchronized StringBuffer append(String str) { super.append(str); return this; }StringBuilder vs StringBuffer
現在我們已經明確的記住了 StringBuffer是線程安全的,而 StringBuilder不是
在效率上, StringBuffer因為對方法做了同步,所以一般是低于 StringBuilder的
二者都是可變的,因為二者都繼承 AbstractStringBuilder,它的 char[] value 沒有使用 final修飾,只是普通數組。 String的 value是 final的,即不可變的
都有實現 CharSequence接口
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/64430.html
摘要:當然大多數情況下就是我們是在單線程下進行的操作,所以大多數情況下是建議用而不用的,就是速度的原因。 第三階段 JAVA常見對象的學習 StringBuffer和StringBuilder類 (一) StringBuffer類的概述 (1) 基本概述 下文以StringBuffer為例 前面我們用字符串做拼接,比較耗時并且也耗內存(每次都會構造一個新的string對象),而這種拼接操作又...
摘要:和它們都是可變的字符串,不過它們之間的區別是初中級面試出現幾率十分高的一道題。區別線程安全線程安全,線程不安全。區別性能既然是線程安全的,它的所有公開方法都是同步的,是沒有對方法加鎖同步的,所以毫無疑問,的性能要遠大于。 StringBuffer 和 StringBuilder 它們都是可變的字符串,不過它們之間的區別是 Java 初中級面試出現幾率十分高的一道題。這么簡單的一道題,棧...
摘要:測試拼接速度測試的結果在循環中,拼接字符串的速度遠低于和利用查看字節碼文件,尋找其中的差異命令行執行結果可以看出,拼接的時候也是通過的方法進行拼接的產生差異的原因是,在每次循環中,拼接的時候都了一個是線程安全的,只比稍慢了一點若不是 String、StringBuilder、StringBuffer 測試拼接速度 @Test public void testString() { ...
摘要:不指定容量會顯著降低性能一般使用在方法內部來完成類似功能,因為是線程不安全的,所以用完以后可以丟棄。主要用在全局變量中相同情況下使用相比使用僅能獲得左右的性能提升,但卻要冒多線程不安全的風險。 String 作為最基礎的引用數據類型,日常的開發中被大量的使用。基于不可變的特性,一旦被過度地使用,堆內存就會負荷不堪,甚至影響性能,為此,Java 設計者特意為 String 在方法區中開辟...
摘要:是線程安全的,很多方法都是方法,而不是線程安全的,但其在單線程程序中的性能比要高。和類的區別也在于此,新引入的類不是線程安全的,但其在單線程中的性能比高。 這兩個類從功能上來講,幾乎沒有任何差別。 1.StringBuilder 首先,String類是不可變類,所以,任何對String的改變都會引發新的String對象的生成;新引入的StringBuilder類不是線程安全的.因為,H...
摘要:如果對于經常改變內容的字符串,使用效率高,但是它只適用于單線程的場景,在多線程場景下,容易導致數據不一致的現象出現。多線程場景下,要使用。在大部分情況下,線程安全的可變字符序列。可將字符串緩沖區安全地用于多個線程。 本人博客 http://www.cnblogs.com/runfor... 總結: 1.String是字符串常量,StringBuffer是線程安全的字符串變量,Stri...
閱讀 1599·2021-11-02 14:48
閱讀 3651·2019-08-30 15:56
閱讀 2767·2019-08-30 15:53
閱讀 3208·2019-08-30 14:09
閱讀 3094·2019-08-30 12:59
閱讀 2853·2019-08-29 18:38
閱讀 2693·2019-08-26 11:41
閱讀 2209·2019-08-23 16:45