StringBuilder
StringBuilder是可變字符串類型,它被人所熟知的功能就是可以很方便的對字符串進(jìn)行拼接、構(gòu)造:
public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence
方法是 final的,繼承了 AbstractStringBuilder抽象類:
abstract class AbstractStringBuilder implements Appendable, CharSequence { char[] value; int count; ... }
可以看到它實(shí)現(xiàn)了 Appendable接口,而 Appendable接口就是提供了可以被添加char序列和值的功能,它實(shí)現(xiàn)了三種 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 序列提供統(tǒng)一的只讀訪問, String StringBuilder StringBuffer都實(shí)現(xiàn)了這個接口:
int length(); char charAt(int index); CharSequence subSequence(int start, int end);
在 AbstractStringBuilder抽象類中,提供了一系列的 append和 insert方法的實(shí)現(xiàn),下面是其中一種實(shí)現(xiàn):
public AbstractStringBuilder append(String str) { if (str == null) str = "null"; //如果為空,則添加null字符串 int len = str.length(); ensureCapacityInternal(count + len);//保證容量 //復(fù)制str字符串到char數(shù)組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); }
如果傳遞的最小容量大于現(xiàn)有容量,則必須進(jìn)行擴(kuò)容:
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中的方法實(shí)現(xiàn)都沒有進(jìn)行同步
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類的出現(xiàn)實(shí)際上比 StringBuilder要早,當(dāng)初提供 StringBuilder類只是為了提供一個單個線程使用的 StringBuffer等價類。如果觀察 StringBuffer的源代碼,可以發(fā)現(xiàn)它的方法和 StringBuilder相同,只不過都加上了 synchronized ,比如:
public synchronized StringBuffer append(String str) { super.append(str); return this; }StringBuilder vs StringBuffer
現(xiàn)在我們已經(jīng)明確的記住了 StringBuffer是線程安全的,而 StringBuilder不是
在效率上, StringBuffer因?yàn)閷Ψ椒ㄗ隽送剑砸话闶堑陀?StringBuilder的
二者都是可變的,因?yàn)槎叨祭^承 AbstractStringBuilder,它的 char[] value 沒有使用 final修飾,只是普通數(shù)組。 String的 value是 final的,即不可變的
都有實(shí)現(xiàn) CharSequence接口
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64430.html
摘要:當(dāng)然大多數(shù)情況下就是我們是在單線程下進(jìn)行的操作,所以大多數(shù)情況下是建議用而不用的,就是速度的原因。 第三階段 JAVA常見對象的學(xué)習(xí) StringBuffer和StringBuilder類 (一) StringBuffer類的概述 (1) 基本概述 下文以StringBuffer為例 前面我們用字符串做拼接,比較耗時并且也耗內(nèi)存(每次都會構(gòu)造一個新的string對象),而這種拼接操作又...
摘要:和它們都是可變的字符串,不過它們之間的區(qū)別是初中級面試出現(xiàn)幾率十分高的一道題。區(qū)別線程安全線程安全,線程不安全。區(qū)別性能既然是線程安全的,它的所有公開方法都是同步的,是沒有對方法加鎖同步的,所以毫無疑問,的性能要遠(yuǎn)大于。 StringBuffer 和 StringBuilder 它們都是可變的字符串,不過它們之間的區(qū)別是 Java 初中級面試出現(xiàn)幾率十分高的一道題。這么簡單的一道題,棧...
摘要:測試拼接速度測試的結(jié)果在循環(huán)中,拼接字符串的速度遠(yuǎn)低于和利用查看字節(jié)碼文件,尋找其中的差異命令行執(zhí)行結(jié)果可以看出,拼接的時候也是通過的方法進(jìn)行拼接的產(chǎn)生差異的原因是,在每次循環(huán)中,拼接的時候都了一個是線程安全的,只比稍慢了一點(diǎn)若不是 String、StringBuilder、StringBuffer 測試拼接速度 @Test public void testString() { ...
摘要:不指定容量會顯著降低性能一般使用在方法內(nèi)部來完成類似功能,因?yàn)槭蔷€程不安全的,所以用完以后可以丟棄。主要用在全局變量中相同情況下使用相比使用僅能獲得左右的性能提升,但卻要冒多線程不安全的風(fēng)險。 String 作為最基礎(chǔ)的引用數(shù)據(jù)類型,日常的開發(fā)中被大量的使用。基于不可變的特性,一旦被過度地使用,堆內(nèi)存就會負(fù)荷不堪,甚至影響性能,為此,Java 設(shè)計(jì)者特意為 String 在方法區(qū)中開辟...
摘要:是線程安全的,很多方法都是方法,而不是線程安全的,但其在單線程程序中的性能比要高。和類的區(qū)別也在于此,新引入的類不是線程安全的,但其在單線程中的性能比高。 這兩個類從功能上來講,幾乎沒有任何差別。 1.StringBuilder 首先,String類是不可變類,所以,任何對String的改變都會引發(fā)新的String對象的生成;新引入的StringBuilder類不是線程安全的.因?yàn)?,H...
摘要:如果對于經(jīng)常改變內(nèi)容的字符串,使用效率高,但是它只適用于單線程的場景,在多線程場景下,容易導(dǎo)致數(shù)據(jù)不一致的現(xiàn)象出現(xiàn)。多線程場景下,要使用。在大部分情況下,線程安全的可變字符序列??蓪⒆址彌_區(qū)安全地用于多個線程。 本人博客 http://www.cnblogs.com/runfor... 總結(jié): 1.String是字符串常量,StringBuffer是線程安全的字符串變量,Stri...
閱讀 1607·2021-11-02 14:48
閱讀 3663·2019-08-30 15:56
閱讀 2777·2019-08-30 15:53
閱讀 3217·2019-08-30 14:09
閱讀 3109·2019-08-30 12:59
閱讀 2864·2019-08-29 18:38
閱讀 2702·2019-08-26 11:41
閱讀 2222·2019-08-23 16:45