為什么Java要把字符串設計成不可變的
String是Java中一個不可變的類,所以他一旦被實例化就無法被修改。不可變類的實例一旦創(chuàng)建,其成員變量的值就不能被修改。不可變類有很多優(yōu)勢。本文總結了為什么字符串被設計成不可變的。將涉及到內(nèi)存、同步和數(shù)據(jù)結構相關的知識。
字符串池
字符串池是方法區(qū)中的一部分特殊存儲。當一個字符串被被創(chuàng)建的時候,首先會去這個字符串池中查找,如果找到,直接返回對該字符串的引用。
下面的代碼只會在堆中創(chuàng)建一個字符串
String string1 = "abcd"; String string2 = "abcd";
下面是圖示:
如果字符串可變的話,當兩個引用指向指向同一個字符串時,對其中一個做修改就會影響另外一個。(請記住該影響,有助于理解后面的內(nèi)容)
緩存Hashcode
Java中經(jīng)常會用到字符串的哈希碼(hashcode)。例如,在HashMap中,字符串的不可變能保證其hashcode永遠保持一致,這樣就可以避免一些不必要的麻煩。這也就意味著每次在使用一個字符串的hashcode的時候不用重新計算一次,這樣更加高效。
在String類中,有以下代碼:
private int hash;//this is used to cache hash code.
以上代碼中hash變量中就保存了一個String對象的hashcode,因為String類不可變,所以一旦對象被創(chuàng)建,該hash值也無法改變。所以,每次想要使用該對象的hashcode的時候,直接返回即可。
使其他類的使用更加便利
在介紹這個內(nèi)容之前,先看以下代碼:
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";
在上面的例子中,如果字符串可以被改變,那么以上用法將有可能違反Set的設計原則,因為Set要求其中的元素不可以重復。上面的代碼只是為了簡單說明該問題,其實String類中并沒有value這個字段值。
安全性
String被廣泛的使用在其他Java類中充當參數(shù)。比如網(wǎng)絡連接、打開文件等操作。如果字符串可變,那么類似操作可能導致安全問題。因為某個方法在調(diào)用連接操作的時候,他認為會連接到某臺機器,但是實際上并沒有(其他引用同一String對象的值修改會導致該連接中的字符串內(nèi)容被修改)??勺兊淖址部赡軐е路瓷涞陌踩珕栴},因為他的參數(shù)也是字符串。
代碼示例:
boolean connect(string s){ if (!isSecure(s)) { throw new SecurityException(); } //如果s在該操作之前被其他的引用所改變,那么就可能導致問題。 causeProblem(s); }
不可變對象天生就是線程安全的
因為不可變對象不能被改變,所以他們可以自由地在多個線程之間共享。不需要任何同步處理。
總之,String被設計成不可變的主要目的是為了安全和高效。所以,使String是一個不可變類是一個很好的設計。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
tio-boot?jfinal-plugins框架整合redis示例詳解
這篇文章主要為大家介紹了tio-boot?jfinal-plugins框架整合redis示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12Spring?Boot實現(xiàn)MyBatis動態(tài)創(chuàng)建表的操作語句
這篇文章主要介紹了Spring?Boot實現(xiàn)MyBatis動態(tài)創(chuàng)建表,MyBatis提供了動態(tài)SQL,我們可以通過動態(tài)SQL,傳入表名等信息然組裝成建表和操作語句,本文通過案例講解展示我們的設計思路,需要的朋友可以參考下2024-01-01詳解SpringBoot 快速整合MyBatis(去XML化)
本篇文章主要介紹了詳解SpringBoot 快速整合MyBatis(去XML化),非常具有實用價值,需要的朋友可以參考下2017-10-10IDEA下使用MyBatisCodeHelper插件的方法詳解
這篇文章主要介紹了IDEA下使用MyBatisCodeHelper插件的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09