摘要:和它們都是可變的字符串,不過它們之間的區別是初中級面試出現幾率十分高的一道題。區別線程安全線程安全,線程不安全。區別性能既然是線程安全的,它的所有公開方法都是同步的,是沒有對方法加鎖同步的,所以毫無疑問,的性能要遠大于。
StringBuffer 和 StringBuilder 它們都是可變的字符串,不過它們之間的區別是 Java 初中級面試出現幾率十分高的一道題。這么簡單的一道題,棧長在最近的面試過程中,卻經常遇到很多求職者說反,搞不清使用場景的情況。
今天,棧長我帶大家徹底搞懂 StringBuffer 和 StringBuilder 的幾個區別和它們的應用場景,如果你是大牛,請略過,如果你是菜鳥,或者對這兩個不是很清楚,可以學習一下,也可以為年底的面試加油沖刺。
先看看 StringBuffer 和 StringBuilder 的類結構吧:
其實很簡單,就是繼承了一個抽象的字符串父類:AbstractStringBuilder。下面我們再來看看它們的三個區別。
區別1:線程安全StringBuffer:線程安全,StringBuilder:線程不安全。因為 StringBuffer 的所有公開方法都是 synchronized 修飾的,而 StringBuilder 并沒有 StringBuilder 修飾。
StringBuffer 代碼片段:
@Override public synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return this; }區別2:緩沖區
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 都會直接使用緩存區的 toStringCache 值來構造一個字符串。
而 StringBuilder 則每次都需要復制一次字符數組,再構造一個字符串。
所以,緩存沖這也是對 StringBuffer 的一個優化吧,不過 StringBuffer 的這個toString 方法仍然是同步的。
區別3:性能既然 StringBuffer 是線程安全的,它的所有公開方法都是同步的,StringBuilder 是沒有對方法加鎖同步的,所以毫無疑問,StringBuilder 的性能要遠大于 StringBuffer。
總結所以,StringBuffer 適用于用在多線程操作同一個 StringBuffer 的場景,如果是單線程場合 StringBuilder 更適合。
以此送給正在面試或者即將去面試的 Java 程序猿們,如果對你有幫助,也歡迎分享給身邊的朋友們,讓大家少走彎路。
本文原創首發于微信公眾號:Java技術棧(id:javastack),關注公眾號在后臺回復 "Java" 可獲取更多,轉載請原樣保留本信息。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/73038.html
摘要:所以如果要進行的操作是多線程的,那么就要使用,但是在單線程的情況下,還是建議使用速度比較快的。總結一下適用于少量的字符串操作的情況適用于單線程下在字符緩沖區進行大量操作的情況適用多線程下在字符緩沖區進行大量操作的情況 [TOC] 原文鏈接:[https://www.cnblogs.com/su-fe...]: 這三個類之間的區別主要是在兩個方面,即運行速度和線程安全這兩方面 1、首先說...
本文原創文章,轉載注明出處,博客地址 https://segmentfault.com/u/to... 第一時間看后續精彩文章。覺得好的話,順手分享到朋友圈吧,感謝支持。 筆者經常忘記三者之間的區別,下面自己總結一番,畫一個表格來展示 Item +區別 多線程 性能 使用場景 優化 String 不可變類,重新創建字符串 不安全 拼接時,性能差 操作少量數據,字符串不變時 無 St...
摘要:與類基本相同,都是可變字符換字符串序列,不同點是是線程安全的,是線程不安全的。和區別在大部分情況下是線程安全的可變字符序列。在程序中可將字符串緩沖區安全地用于多線程。 轉載自飄過的小牛 我們先要記住三者的特征: String 字符串常量 StringBuffer 字符串變量(線程安全) StringBuilder 字符串變量(非線程安全) 一、定義 showImg(/...
摘要:不指定容量會顯著降低性能一般使用在方法內部來完成類似功能,因為是線程不安全的,所以用完以后可以丟棄。主要用在全局變量中相同情況下使用相比使用僅能獲得左右的性能提升,但卻要冒多線程不安全的風險。 String 作為最基礎的引用數據類型,日常的開發中被大量的使用。基于不可變的特性,一旦被過度地使用,堆內存就會負荷不堪,甚至影響性能,為此,Java 設計者特意為 String 在方法區中開辟...
摘要:在中,是不可變類型,所以對于字符串的操作提供了兩個輔助類和。考慮如下代碼在利用直接進行拼接時,每次循環都會生成一個新的對象,也就是說等同這樣運行的效率明顯是低于顯式調用的。 在Java中,String是不可變類型,所以對于字符串的操作提供了兩個輔助類:StringBuffer和StringBuilder。 這個兩個類的主要區別在于: StringBuilder的效率更高 Stri...
閱讀 3170·2021-09-10 10:51
閱讀 3351·2021-08-31 09:38
閱讀 1639·2019-08-30 15:54
閱讀 3129·2019-08-29 17:22
閱讀 3214·2019-08-26 13:53
閱讀 1960·2019-08-26 11:59
閱讀 3283·2019-08-26 11:37
閱讀 3308·2019-08-26 10:47