1. 程式人生 > >Java原始碼系列(4):String,StringBuilder,StringBuffer區別

Java原始碼系列(4):String,StringBuilder,StringBuffer區別

hi,國慶節後第一篇。首先,祝大家國慶節快樂,然後祝大家上班快樂。

既然上班了,那就知識學起來,今天咱說一下String,StringBuffer和StringBuilder的區別,這是面試必問,但是如果是工作了的小哥哥和小姐姐,就不會傻白甜的問這個問題,但咱還是要知道的,畢竟要是不會,要被面試的人笑死了,咱丟不起這人呢。

話不多說,先看結論。

1.執行速度從快到慢:StringBuilder>StringBuffer>String

理由是:

  • StringBuilder和StringBuffer擁有的成員屬性和成員方法基本相同,區別就是StringBuffer的成員方法前面多了synchronized關鍵字,保證了執行緒安全,所以StringBuffer的速度比StringBuilder的速度要慢。貼圖鎮樓
  • String在最後的原因是他是字串常量,而StringBuilder和StringBuffer都是字串變數,也就是String一旦建立之後該物件是不可更改的,但是其他的兩個是變數,是可以更改的。

看程式碼 

 

他們兩種方法輸出的結構是一樣的,那我們先看一下變數str在25行,27行的地址是否相同,程式碼執行過程如下:

我們看出在25行地址是497,在27行地址是499,就說明Java首先建立一個String物件str,並把“abc”賦值給str,然後在27行中,其實JVM又建立了一個新的物件也名為str,然後再把原來的str的值和“de”加起來再賦值給新的str,而原來的str就會被JVM的垃圾回收機制(GC)給回收掉了,所以,str實際上並沒有被更改,也就是前面說的String物件一旦建立之後就不可更改了。所以,Java中對String物件進行的操作實際上是一個不斷建立新的物件並且將舊的物件回收的一個過程

,所以執行速度很慢。

那我們再看一下變數stringBuffer在30行和32行中變數有沒有變化,程式碼執行過程如下:

我們看出在地址並沒有發生變化,就說明在這個過程中,stringBuffer的位置並沒有變化。

2.StringBuffer是執行緒安全的,StringBuilder是執行緒不安全的。

理由是:StringBuffer中方法有synchronized關鍵字,來保證執行緒安全性。