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

來源:互聯網
上載者:User

標籤:概念   記憶   欄位   效率   技術   nbsp   change   com   security   

原文連結:https://www.programcreek.com/2013/04/why-string-is-immutable-in-java/

java字串是不可變的。不可變類只是一個不能修改執行個體的類。執行個體建立時所有的資訊都被初始化,並且資訊不能被修改。不可變類有許多優點。本文總結了字串為什麼被設計成不可變的原因。這說明在記憶的角度不變性的概念,同步和資料結構。

1.字串池的要求:

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

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

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

 :

如果字串是可變的,用一個引用更改字串將導致其他引用的值錯誤。

2.緩衝Hashcode:

在Java中,字串的Hashcode經常被用到。例如,在一個HashMap或HashSet。一成不變的保證hashcode永遠是相同的所以它可以兌現,不用擔心變化。這意味著,不需要計算hashCode每次使用它。這更有效。

在String類中,它有以下代碼:

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

 3.經常使用其他對象:

為了說明這個問題,考慮下面的程式:

HashSet<String> set = new HashSet<String>();set.add(new String("a"));set.add(new String("b"));set.add(new String("c")); for(String a: set)a.value = "a";

在這個例子中,如果字串是可變的,它的值是可以改變的,將違反設計集(包含非重複元素)。當然,上面的樣本僅用於示範目的,在真正的字串類中沒有值欄位。

4.安全:

字串被廣泛用於許多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);}

5.不可變對象自然是安全執行緒的:

因為不可變對象不能更改,所以可以在多個線程之間自由共用。這消除了進行同步的要求。

總之,字串是為了效率和安全原因而不可變的。這也是為什麼在很多情況下首選類是不可變類的原因。

為什麼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.