為什麼字串在Java中是不可變的?__String

來源:互聯網
上載者:User

 這是一個古老但仍然流行的問題。Java中字串被設計成不可變的,有多種原因。很好的答案取決於你對記憶體,同步,資料結構等更好的理解,下面,我總結一些答案。

1.String Pool中的要求

字串池在方法區(Method Area)中是一種特殊的儲存地區。當建立一個字串時,如果字串已經存在於池中,現有字串的引用將被退回,而不是建立一個新的對象並返回其引用。

下面的代碼將在堆中只會建立一個字串對象。

String string1 = "abcd";String string2 = "abcd";

在堆中就是這樣的:


如果字串不是一成不變的,在只有一個引用下不斷變化的字串將導致對其他引用取得錯誤的值。

2.允許字串來緩衝其雜湊碼

在Java中字串的雜湊碼常被用到。例如,在HashMap中不可變保證了雜湊碼將永遠是相同的,因此,完全不用擔心字串的變化實現這個不可變的特性,這意味著,每次被用時沒必要去計算其雜湊碼,所以,這更有效。

在String類,類中有如下代碼:

private int hash;//this is used to cache hash code.

3.安全性
字串為許多Java類被廣泛用作參數,如網路連接,開啟檔案等,如果字串是可變的,則串連,開啟檔案將會被改變並會導致嚴重的安全威脅。該方法還以為是串連到一台機器上,但事實並非如此。可變字串在反射機制中同樣能引起安全性問題,因為這些參數都是字串。

下面是一段程式碼範例:

boolean connect(string s){    if (!isSecure(s)) { throw new SecurityException(); }    //here will cause problem, if s is changed before this by using other references.        causeProblem(s);}

綜上所述,原因包括設計,效率和安全性。其實,這也適用於在Java面試中許多其他“為什麼”問題。


原文: Why string is immutable in Java ?


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.