java中的String,javaString

來源:互聯網
上載者:User

java中的String,javaString

String作為java最常用的類,被廣大程式員們蹂躪已久,讓我們又愛又恨,應該如何正確的使用它呢,老薑帶你一起來揭開它神秘的面紗。

 

一、String類定義時被冠上了final的標識符,決定了它終生不可變的特質。

  final:修飾類時,類不可被繼承。

      設計初衷:類不需要有子類,類的實現細節不允許改變,並且確信這個類不會被擴充;編譯器會對final進行最佳化,提高執行效率。

 

二、String類的任何操作都會產生新的字串對象。

  前面我們講過,String是final的,既然不可改變,自然會產生新的對象。我們看下面一段代碼:

      String a = "abc123";

  a.subString(3);

      system.out.println(a);

      以上代碼會輸出什麼呢?答案是abc123,因為a從未被改變,a.subString(3)的結果並未重新賦值給變數a。

 

三、String常量池

  相信有過面試經驗的同學們,肯定遇到過類似這樣的問題:String a = new String("a");這段代碼產生了幾個對象?

      我的回答是1個或者2個。

      1:如果此行代碼之前定義過“a”這個變數,那麼只會產生new String("a")這麼一個對象。

      2:相反,之前未定義過,就會存在“a”以及new String("a")這兩個對象。

      ps:有些同學要問了,那麼變數a呢?它不是對象嗎?

      a只是一個變數,它存放對象new String("a")的引用,它不能稱之為對象,僅僅是一個別名而已。

      我們知道,在函數中定義的一些基本類型的變數和對象的引用變數在函數的棧記憶體中分配,new建立的對象和數組存放在堆記憶體中。

      除此之外還有一個常量池存在,它是在編譯期被確定的,被儲存在class檔案中,String常量就包含其中。例如,

  String s = “abcd”;

  String s2 = “abcd”;

  此處只會產生一個對象“abcd”,且存放在常量池中,並且s1==s2 為true。

  String s3 = "ab" + "cd";

  s3 == s?答案是true,因為編譯器會對直接字串常量的“+”運算最佳化為s3 =“abcd”且被存放至常量池中。

 

四、字串的拼接

  1)少量字串相加,直接用“+”,如:String a = a1+a2+a3;

  2)大量字串拼接,用StringBuilder,如:

      StringBuilder sb = new StringBuilder();

      for(int i=0;i<100;i++){

          sb.append(i);    

      }

  String s = sb.toString();

      StringBuilder內部維護了一個初始值為16的char型數組,容積不足時2倍擴充。所以如果能夠預測到你最終拼接的字串大小,在初始化時不妨這樣寫:

    StringBuilder sb = new StringBuilder(100);避免空間不足,反覆開闢記憶體,影響效率。

      ps:String作為常量,每次“+”都會產生新的對象,反覆開闢記憶體,效率自然下降。

  3)考慮到安全執行緒的情況,就要用到StringBuffer了,它的內部實現與StringBuilder類似,不過實現了資料同步,效率要低於StringBuilder。

 

五、字串的比較

1、為空白比較:

  if(null == s || "".equals(s)){...}

  把null==s放在左面以及""放在equals左邊,因為s有可能為null,直接造成程式null 指標異常:java.lang.NullPointerException。

      ps:另一種寫法,if(null==s||s.length()==0){...},話說這種效率要高於equals。

 

2.兩個對象進行比較

  大多數情況下,我們關心的是字串的值,而非記憶體位址,用equals進行比較。

      在運行期,使用"=="進行字串的比較,結果往往是不會讓你滿意的,有時會讓我們踩在坑裡好久好久,不停的問自己,為什麼這段邏輯始終不正確呢?因為永遠執行不到。

 

今天就寫到這裡,有沒有能觸動到你的地方呢?

 

關注老薑談技術,號:helojava,或者掃描下面二維碼。


每日一帖,技術雞湯。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.