回覆列表
  • 1 # IT人劉俊明

    首先,Java中的String物件一旦被建立就具備不可修改的特性,對String物件的任何操作都不能改變原來String的值,任何改變的操作都會產生一個新的物件。為了驗證這個特性,我們來看一個小實驗:

    透過這個實驗我們會發現一個問題,就是對字串String的任何操作(改變大小寫、替換等)都不會影響字串物件hello本來的值,但是這些更改的操作會產生一個新的物件,新的物件確實擁有了修改後的新值。

    String類還有一個非常重要的特徵,就是String類是final修飾的,也就是我們通常所說的“最終類”,這說明String類放棄了擁有子類的權利,看一下Java官方文件(jdk9)對String類的描述:

    透過這個描述可以清晰的看到String類的定義是final的。

    其實,Java中的String類雖然看似簡單明瞭,但是關於String的內容遠比看起來的要複雜的多,因為String涉及到了JVM中三個關鍵的概念,分別是“常量池”、“棧”和“堆”。由於String類的頻繁使用會佔用大量的時間(空間),所以JVM為String類建立了一個存放字串的“常量池”,池中存放了大量的字串常量。為了理解這個字串常量池,我們可以看一個簡單的實驗:

    透過這個實驗我們可以看出,兩個物件StringA和StringB是指向同一個字串常量,所以他們對比的返回值是true。接著看下面這個例子:

    這個例子卻返回了截然不同的結果,原因在於new每次會建立一個新的物件,所以對比的結果是false(關於這個解釋其實可以描述的非常複雜,這裡就略了)。

    關於String的內容雖然看似簡單,實則比較複雜,我們能透過String類來解釋很多JVM的執行機制,所以String類是一個值得深究的類。

    如果有Java方面的問題,也可以諮詢我。

  • 2 # 五環外成功人士

    String原始碼前五行程式碼就給你解釋的明明白白。第一行String類為final修飾,不可繼承不可修改。當然我們都應該知道一個引用型別不變必須是值不變,才能是我們希望的不變。那麼String第一個屬性value就是不可變的,首先value是一個char陣列用來存放String的char字元。那你就會認為那麼char陣列的值如果變了不就導致String變了嗎,所以String的value不但是final的而且還是private的。所以一個String被例項化之後就是不可變的了。

  • 中秋節和大豐收的關聯?
  • 為什麼佐助沒有像鳴人一樣安一個假的手臂?