更新時間:2020-04-02 16:16:02 來源:動力節點 瀏覽2222次
字符串,想必大家最熟悉不過了,通常我們在代碼中有幾種方式可以創建字符串,比如:String s = "Hollis";這時,其實會在堆內存中創建一個字符串對象,其中保存了一個字符數組,該數組中保存了字符串的內容。
上面的箭頭可以理解為“存儲他的引用”。
當我們在代碼中連續創建兩個相同的字符串的時候,其實會指向同一個對象。因為當一個字符串被被創建的時候,首先會去這個字符串池中查找,如果找到,直接返回對該字符串的引用。
但是,如果在程序中明確聲明要新創建一個字符串的話是可以在堆上重新創建一個對象的。如String s = new String("Hollis")
接著,我們來看兩個字符串中常用的操作:截取和連接會發生什么,是在原來的字符串對象上修改還是重新創建字符串呢?
字符串的連接。如String s1 = s.concat("Chuang");
字符串的截取。如String s1 = s.substring(0,2);
從上圖中我們可以得到一個結論,那就是——字符串是不可變的,無論發生什么操作,一個已經創建好的字符串的內容不會被改變,對它的任何類似修改的操作其實都是新生成了一個字符串對象。
那么,為什么要定義出不可變對象呢?
緩存Hashcode
Java中經常會用到字符串的哈希碼(hashcode)。例如,在HashMap中,字符串的不可變能保證其hashcode永遠保持一致,這樣就可以避免一些不必要的麻煩。這也就意味著每次在使用一個字符串的hashcode的時候不用重新計算一次,這樣更加高效。
在String類中,有以下代碼:private int hash;
以上代碼中hash變量中就保存了一個String對象的hashcode,因為String類不可變,所以一旦對象被創建,該hash值也無法改變。所以,每次想要使用該對象的hashcode的時候,直接返回即可。
使其他類的使用更加便利
在介紹這個內容之前,先看以下代碼:
在上面的例子中,如果字符串可以被改變,那么以上用法將有可能違反Set的設計原則,因為Set要求其中的元素不可以重復。上面的代碼只是為了簡單說明該問題,其實String類中并沒有value這個字段值。
安全性
String被廣泛的使用在其他Java類中充當參數。比如網絡連接、打開文件等操作。如果字符串可變,那么類似操作可能導致安全問題。因為某個方法在調用連接操作的時候,他認為會連接到某臺機器,但是實際上并沒有(其他引用同一String對象的值修改會導致該連接中的字符串內容被修改)??勺兊淖址部赡軐е路瓷涞陌踩珕栴},因為他的參數也是字符串。
不可變對象天生就是線程安全的
因為不可變對象不能被改變,所以他們可以自由地在多個線程之間共享。不需要任何同步處理。
總之,String被設計成不可變的主要目的是為了安全和高效。所以,使String是一個不可變類是一個很好的設計。
以上就是動力節點java培訓機構的小編針對“Java基礎學習:java字符型定義不可變”的內容進行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習