前言
今天就來介紹一下String 和 StringBuffer芦劣、StringBuilder之間的區(qū)別
區(qū)別
簡單說明一下相同點:1.String 和 StringBuffer寄狼、StringBuilder他們都是java.lang包下的類
- java.lang.String
- java.lang.StringBuffer
-
java.lang.StrungBuilder
2.String 和 StringBuffer枫振、StringBuilder他們都是final類(最終類),不允許被繼承斑鼻。
下面按照可變性蒋纬,線程安全性,以及性能三個方面來闡述坚弱。
可變性
簡單的來說:
String 類中使用 final 關鍵字字符數組保存字符串蜀备, private final char value[] ,所以 String 對象是不可變的荒叶。
而 StringBuilder 與 StringBuffer 都繼承自 AbstractStringBuilder 類碾阁,在 AbstractStringBuilder 中也是使用字符數組保存字符串 char[]value 但是沒有用 final 關鍵字修飾,所以這兩種對象都是可變的些楣。
線程安全性
- String 中的對象是不可變的脂凶,也就可以理解為常量宪睹,線程安全。
AbstractStringBuilder 是 StringBuilder 與 StringBuffer 的公共父類蚕钦,定義了一些字符串的基本操作亭病,如 expandCapacity、append嘶居、insert罪帖、indexOf 等公共方法。
StringBuffer 對方法加了同步鎖或者對調用的方法加了同步鎖邮屁,所以是線程安全的整袁。
StringBuilder 并沒有對方法進行加同步鎖, 所以是非線程安全的佑吝。
性能
每次對 String 類型進行改變的時候坐昙,都會生成一個新的 String 對象,然后將指針指向新的 String 對象芋忿。
StringBuffer 每次都會對 StringBuffer 對象本身進行操作炸客,而不是生成新的對象并改變對象引用。
相同情況下使用 StirngBuilder 相比使用 StringBuffer 僅能獲得 10%~15% 左右的性能提升盗飒,但卻要冒多線程不安全的風險嚷量。
對于三者使用的總結
- 操作少量的數據 = String
- 單線程操作字符串緩沖區(qū)下操作大量數據 = StringBuilder
- 多線程操作字符串緩沖區(qū)下操作大量數據 = StringBuffer
感謝諸君的觀看,文中如有紕漏逆趣,歡迎在評論區(qū)來交流蝶溶。如果這篇文章幫助到了你,歡迎點贊??關注宣渗。