摘要:和它們都是可變的字符串,不過(guò)它們之間的區(qū)別是初中級(jí)面試出現(xiàn)幾率十分高的一道題。區(qū)別線程安全線程安全,線程不安全。區(qū)別性能既然是線程安全的,它的所有公開(kāi)方法都是同步的,是沒(méi)有對(duì)方法加鎖同步的,所以毫無(wú)疑問(wèn),的性能要遠(yuǎn)大于。
StringBuffer 和 StringBuilder 它們都是可變的字符串,不過(guò)它們之間的區(qū)別是 Java 初中級(jí)面試出現(xiàn)幾率十分高的一道題。這么簡(jiǎn)單的一道題,棧長(zhǎng)在最近的面試過(guò)程中,卻經(jīng)常遇到很多求職者說(shuō)反,搞不清使用場(chǎng)景的情況。
今天,棧長(zhǎng)我?guī)Т蠹覐氐赘愣?StringBuffer 和 StringBuilder 的幾個(gè)區(qū)別和它們的應(yīng)用場(chǎng)景,如果你是大牛,請(qǐng)略過(guò),如果你是菜鳥(niǎo),或者對(duì)這兩個(gè)不是很清楚,可以學(xué)習(xí)一下,也可以為年底的面試加油沖刺。
先看看 StringBuffer 和 StringBuilder 的類結(jié)構(gòu)吧:
其實(shí)很簡(jiǎn)單,就是繼承了一個(gè)抽象的字符串父類:AbstractStringBuilder。下面我們?cè)賮?lái)看看它們的三個(gè)區(qū)別。
區(qū)別1:線程安全StringBuffer:線程安全,StringBuilder:線程不安全。因?yàn)?StringBuffer 的所有公開(kāi)方法都是 synchronized 修飾的,而 StringBuilder 并沒(méi)有 StringBuilder 修飾。
StringBuffer 代碼片段:
@Override public synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return this; }區(qū)別2:緩沖區(qū)
StringBuffer 代碼片段:
private transient char[] toStringCache; @Override public synchronized String toString() { if (toStringCache == null) { toStringCache = Arrays.copyOfRange(value, 0, count); } return new String(toStringCache, true); }
StringBuilder 代碼片段:
@Override public String toString() { // Create a copy, don"t share the array return new String(value, 0, count); }
可以看出,StringBuffer 每次獲取 toString 都會(huì)直接使用緩存區(qū)的 toStringCache 值來(lái)構(gòu)造一個(gè)字符串。
而 StringBuilder 則每次都需要復(fù)制一次字符數(shù)組,再構(gòu)造一個(gè)字符串。
所以,緩存沖這也是對(duì) StringBuffer 的一個(gè)優(yōu)化吧,不過(guò) StringBuffer 的這個(gè)toString 方法仍然是同步的。
區(qū)別3:性能既然 StringBuffer 是線程安全的,它的所有公開(kāi)方法都是同步的,StringBuilder 是沒(méi)有對(duì)方法加鎖同步的,所以毫無(wú)疑問(wèn),StringBuilder 的性能要遠(yuǎn)大于 StringBuffer。
總結(jié)所以,StringBuffer 適用于用在多線程操作同一個(gè) StringBuffer 的場(chǎng)景,如果是單線程場(chǎng)合 StringBuilder 更適合。
以此送給正在面試或者即將去面試的 Java 程序猿們,如果對(duì)你有幫助,也歡迎分享給身邊的朋友們,讓大家少走彎路。
本文原創(chuàng)首發(fā)于微信公眾號(hào):Java技術(shù)棧(id:javastack),關(guān)注公眾號(hào)在后臺(tái)回復(fù) "Java" 可獲取更多,轉(zhuǎn)載請(qǐng)?jiān)瓨颖A舯拘畔ⅰ?/pre>
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/73038.html
摘要:所以如果要進(jìn)行的操作是多線程的,那么就要使用,但是在單線程的情況下,還是建議使用速度比較快的。總結(jié)一下適用于少量的字符串操作的情況適用于單線程下在字符緩沖區(qū)進(jìn)行大量操作的情況適用多線程下在字符緩沖區(qū)進(jìn)行大量操作的情況 [TOC] 原文鏈接:[https://www.cnblogs.com/su-fe...]: 這三個(gè)類之間的區(qū)別主要是在兩個(gè)方面,即運(yùn)行速度和線程安全這兩方面 1、首先說(shuō)...
本文原創(chuàng)文章,轉(zhuǎn)載注明出處,博客地址 https://segmentfault.com/u/to... 第一時(shí)間看后續(xù)精彩文章。覺(jué)得好的話,順手分享到朋友圈吧,感謝支持。 筆者經(jīng)常忘記三者之間的區(qū)別,下面自己總結(jié)一番,畫一個(gè)表格來(lái)展示 Item +區(qū)別 多線程 性能 使用場(chǎng)景 優(yōu)化 String 不可變類,重新創(chuàng)建字符串 不安全 拼接時(shí),性能差 操作少量數(shù)據(jù),字符串不變時(shí) 無(wú) St...
摘要:與類基本相同,都是可變字符換字符串序列,不同點(diǎn)是是線程安全的,是線程不安全的。和區(qū)別在大部分情況下是線程安全的可變字符序列。在程序中可將字符串緩沖區(qū)安全地用于多線程。 轉(zhuǎn)載自飄過(guò)的小牛 我們先要記住三者的特征: String 字符串常量 StringBuffer 字符串變量(線程安全) StringBuilder 字符串變量(非線程安全) 一、定義 showImg(/...
摘要:不指定容量會(huì)顯著降低性能一般使用在方法內(nèi)部來(lái)完成類似功能,因?yàn)槭蔷€程不安全的,所以用完以后可以丟棄。主要用在全局變量中相同情況下使用相比使用僅能獲得左右的性能提升,但卻要冒多線程不安全的風(fēng)險(xiǎn)。 String 作為最基礎(chǔ)的引用數(shù)據(jù)類型,日常的開(kāi)發(fā)中被大量的使用?;诓豢勺兊奶匦?,一旦被過(guò)度地使用,堆內(nèi)存就會(huì)負(fù)荷不堪,甚至影響性能,為此,Java 設(shè)計(jì)者特意為 String 在方法區(qū)中開(kāi)辟...
摘要:在中,是不可變類型,所以對(duì)于字符串的操作提供了兩個(gè)輔助類和??紤]如下代碼在利用直接進(jìn)行拼接時(shí),每次循環(huán)都會(huì)生成一個(gè)新的對(duì)象,也就是說(shuō)等同這樣運(yùn)行的效率明顯是低于顯式調(diào)用的。 在Java中,String是不可變類型,所以對(duì)于字符串的操作提供了兩個(gè)輔助類:StringBuffer和StringBuilder。 這個(gè)兩個(gè)類的主要區(qū)別在于: StringBuilder的效率更高 Stri...
閱讀 3179·2021-09-10 10:51
閱讀 3361·2021-08-31 09:38
閱讀 1655·2019-08-30 15:54
閱讀 3142·2019-08-29 17:22
閱讀 3222·2019-08-26 13:53
閱讀 1973·2019-08-26 11:59
閱讀 3292·2019-08-26 11:37
閱讀 3319·2019-08-26 10:47