回覆列表
-
1 # 但求無Bug
-
2 # jimware
有兩個原因,
1.string是享元模式的,在記憶體空間中有常量池,可以複用,所以效率高
2.stringbuffer被同步關鍵字修飾,所有操作都是帶鎖的,是執行緒安全的,所以效率差一點
有兩個原因,
1.string是享元模式的,在記憶體空間中有常量池,可以複用,所以效率高
2.stringbuffer被同步關鍵字修飾,所有操作都是帶鎖的,是執行緒安全的,所以效率差一點
其實,String和StringBuffer在Java中都是用作字串處理。當然,這兩個類還經常會跟StringBuilder進行比較。
其實不論是String還是StringBuilder和StringBuffer,都是基於字元陣列實現(JDK8之後是基於位元組陣列實現)。但是三者之間的異同點是什麼呢?
其中,String類是被final進行修飾的,因此其值不可變。當然,大家肯定會有疑問,String不是可以用“+”號進行字串拼接運算沒?我列印過那個值,值確實改變了。對此我需要解釋一下,所謂字串拼接,只不過是新生成一個字串後將新生成的字串賦給了原本的變數罷了。當然,中間還會包含一次在字串常量池判斷是否已存在字串值的操作。但不管怎麼操作,最終的結果都是用拼接後的新字串取代了舊的字串,或者對該字串變數重新進行了賦值。
而StringBuffer和StringBuilder的值則可變的,如果只是日常使用,這兩者並沒有太大的區別。只不過在多執行緒環境中使用時候,StringBuffer的效率要差些。因為StringBuffer的方法被synchronized關鍵字修飾,也就是說當StringBuffer被多個執行緒共享時,會存在鎖爭搶和等待問題,從而導致耗時增加。而StringBuilder則沒有個限制,但是卻容易發生執行緒安全問題。
所以業內使用習慣是,單執行緒中用StringBuilder, 多執行緒中用StringBuffer。