Java中String類爲何設置成final?

String怎麼保證不可變?

雖然final表明了不可變,但僅僅是引用地址不可變,並不表明了數組自己不會變,如:json

import com.alibaba.fastjson.JSON; public class Test { public static void main(String[] args) { final int[] i = {1, 2, 3, 4}; System.out.println(JSON.toJSONString(i));//[1,2,3,4]
        i[2] = 5; System.out.println(JSON.toJSONString(i));//[1,2,5,4]
 } }

final也能夠將數組自己改變的,這個時候,起做用的還有private,正是由於二者保證了String的不可變性。數組

String爲何保證不可變?

1.爲了實現字符串池

只有當字符串是不可變的,字符串池纔有可能實現。字符串池的實現能夠在運行時節約不少heap空間,由於不一樣的字符串變量都指向池中的同一個字符串。但若是字符串是可變的,那麼String interning將不能實現,由於這樣的話,若是變量改變了它的值,那麼其它指向這個值的變量的值也會一塊兒改變。緩存

        2.爲了線程安全

由於字符串是不可變的,因此是多線程安全的,同一個字符串實例能夠被多個線程共享。這樣便不用由於線程安全問題而使用同步。字符串本身即是線程安全的。安全

        3.爲了實現String能夠建立HashCode不可變性

 由於字符串是不可變的,因此在它建立的時候HashCode就被緩存了,不須要從新計算。這就使得字符串很適合做爲Map中的鍵,字符串的處理速度要快過其它的鍵對象。這就是HashMap中的鍵每每都使用字符串。多線程

 

其餘觀點:

 

其餘 包括Integer Long Character 被設計成final的緣由相似spa

https://www.zhihu.com/question/31345592.net

https://blog.csdn.net/bn493235694/article/details/79599883線程

相關文章
相關標籤/搜索