1. 程式人生 > >String、StringBuffer、StringBuilder區別

String、StringBuffer、StringBuilder區別

lan 源碼 value 最好 技術分享 情況 操作 target 安全

1.三個類之間的關系

StringBuffer和StringBuilder都繼承自AbstractStringBuilder這個類,而AbstractStringBuilder和String都繼承自Object這個類(Object是所有java類的超類)

技術分享圖片

2.String是不可變類,而StringBuffer, StringBuilder是可變類

  我們查看這三個類的源碼,String:字符串常量,字符串長度不可變。Java中String是immutable(不可變)的。源碼中 private final char value[]; 因為value被final修飾,所以不可變

而StringBuffer 與 StringBuilder 中的方法和功能完全是等價的,只是StringBuffer 中的方法大都采用了 synchronized 關鍵字進行修飾,因此是線程安全的,而 StringBuilder 沒有這個修飾,可以被認為是線程不安全的。

3.執行速度 (性能) 上對比

 在執行速度上,String < StringBuffer < Stringbuilder 。

  3.1 String < StringBuffer

  這是因為String類是不可變的,即字符串常量,所以每次對 String 類型進行改變的時候其實都等同於生成了一個新的 String 對象,然後將指針指向新的 String 對象。這就會對程序運行產生很大的影響,因為當內存中的無引用對象多了以後,JVM的GC進程就會進行垃圾回收,這個過程會耗費很長一段時間,因此經常改變內容的字符串最好不要用 String類的對象。而如果是使用 StringBuffer 類則結果就不一樣了,每次結果都會對 StringBuffer 對象本身進行操作,而不是生成新的對象,再改變對象引用。所以在一般情況下我們推薦使用 StringBuffer ,特別是字符串對象經常改變的情況下。
  但是在某些特殊情況下, String 對象的字符串拼接其實是被 JVM 解釋成了 StringBuffer 對象的拼接,所以這些時候 String 對象的速度並不會比 StringBuffer 對象慢,而特別是以下的字符串對象生成中, String 運行速度是遠要比 StringBuffer 快的:

技術分享圖片

  但是如果要拼接的字符串來自於不同的String對象的話,那結果就不一樣了:

技術分享圖片

  這時候使用StringBuffer的運行速度更快

String、StringBuffer、StringBuilder區別