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設計為不可變,是為了提高效率和安全性。在廣泛的設計開發中,不可變類是首要選擇。