Java中String為什么是不可變的


1、在Java中,String類是不可變類,一個不可變類是一個簡單的類,並且這個的實例也不能被修改,

這個類的實例創建的時候初始化所有的信息,並且這些信息不能夠被修改

2、字符串常量池

字符串常量池是方法區中一塊特殊的存儲區域,當創建一個字符串常量的時候,判斷該字符串字在符串字符串常量池中是否已經存在

如果存在,返回已經存在的字符串的引用;如果不存在,則創建一個新的字符串常量,並返回其引用

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

變量string1,string2指向常量池中的同一個字符串常量對象;如果String是可變的,給一個變量重新賦值一個引用,將會指向錯誤的值

3、緩存哈希值

在Java中字符串的哈希值會經常被使用到。例如在HashMap中,String的不可變總能保證哈希值總是相等的,並且緩存起來,不用擔心會改變,

那意味着不需要每次都計算哈希值,這樣會提高效率。在String類中有以下的代碼:

private int hash; //用來緩存哈希值

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";

在上述代碼中,如果String是可變的,那么它的值會被改變,但是這違背了Set集合元素不能重復的設計

4、安全性

String被作為參數廣泛的在 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、不可變的對象同樣是線程安全的

因為不可變的對象不能被改變,他們可以在多個線程中共享,就不需要使用線程的同步操作

總之,把String設計為不可變,是為了提高效率和安全性。在廣泛的設計開發中,不可變類是首要選擇。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM