String 、StringBuffer和Stringbild的區別

String詳解

String類是被final修飾的類, 不能被繼承,沒有提供用於修改字符串的方法。
聲明String的兩種方式
1.String str1=”first”;
jvm在運行時先查找常量池中是否有該字符串,如果有則直接返回該字符串的引用給first(實現了字符串 的共享) ;否則先在常量池中創建該字符串並返回引用。
此時只會在常量池中創建String對象,不會在堆中創建。
2.String str2=new String(“second”);
該代碼生成了兩個String對象。因爲使用了“”會現在常量池中查找是否存在second對象,沒有則創建
否則不創建;在常量池創建完成後,由於使用了new,jvm會在堆中創建內容相同的String對象,並將引用
返回給str2.
特點:
String類對象爲不可變字符串,如字符串 string=”HELLO”永遠只包含HELLO這幾個字母,而不能修改其中任何一個字符。當然可以修改字符串變量string的引用,讓它引用另一個字符串。
不可變字符串有一個優點:編譯器可以讓字符串實現共享。實際上只有字符串常量(直接使用“ ”聲明,存儲在字符串常量池中)是共享的,subStrng,+等操作產生的結果不能共享。
比較字符串值是否相等時使用equals()方法,不能使用==, == 比較的是字符串的地址是否相同。如果字符串在常量池中,可以使用==比較,因爲指向的都是同一個字符串。

String 、StringBuffer和Stringbild的區別

這三個類之間的區別主要是在兩個方面,即運行速度和線程安全這兩方面。

  1. 首先說運行速度,或者說是執行速度,在這方面運行速度快慢爲:StringBuilder > StringBuffer > String
      String最慢的原因:
      String爲字符串常量,而StringBuilder和StringBuffer均爲字符串變量,即String對象一旦創建之後該對象是不可更改的,但後兩者的對象是變量,是可以更改的。
      2. 再來說線程安全
      在線程安全上,StringBuilder是線程不安全的,而StringBuffer是線程安全的
      如果一個StringBuffer對象在字符串緩衝區被多個線程使用時,StringBuffer中很多方法可以帶有synchronized關鍵字,所以可以保證線程是安全的,但StringBuilder的方法則沒有該關鍵字,所以不能保證線程安全,有可能會出現一些錯誤的操作。所以如果要進行的操作是多線程的,那麼就要使用StringBuffer,但是在單線程的情況下,還是建議使用速度比較快的StringBuilder。
      3. 總結一下
      String:適用於少量的字符串操作的情況
      StringBuilder:適用於單線程下在字符緩衝區進行大量操作的情況
      StringBuffer:適用多線程下在字符緩衝區進行大量操作的情況
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章