AD

2017年9月8日星期五

為什麼Java要把字符串設計成不可變的

StringJava中一個不可變的類,所以他一旦被實例化就無法被修改。不可變類的實例一旦創建,其成員變量的值就不能被修改。不可變類有很多優勢。本文總結了為什麼字符串被設計成不可變的。將涉及到內存、同步和數據結構相關的知識。

字符串池

字符串池是方法區中的一部分特殊存儲。當一個字符串被被創建的時候,首先會去這個字符串池中查找,如果找到,直接返回對該字符串的引用。

下麵的代碼隻會在堆中創建一個字符串

 下麵是圖示:


 

如果字符串可變的話,當兩個引用指向指向同一個字符串時,對其中一個做修改就會影響另外一個。(請記住該影響,有助於理解後麵的內容)

緩存Hashcode

Java中經常會用到字符串的哈希碼(hashcode)。例如,在HashMap中,字符串的不可變能保證其hashcode永遠保持一致,這樣就可以避免一些不必要的麻煩。這也就意味著每次在使用一個字符串的hashcode的時候不用重新計算一次,這樣更加高效。

String類中,有以下代碼:

 以上代碼中hash變量中就保存了一個String對象的hashcode,因為String類不可變,所以一旦對象被創建,該hash值也無法改變。所以,每次想要使用該對象的hashcode的時候,直接返回即可。

使其他類的使用更加便利

在介紹這個內容之前,先看以下代碼:

 在上麵的例子中,如果字符串可以被改變,那麼以上用法將有可能違反Set的設計原則,因為Set要求其中的元素不可以重複。上麵的代碼隻是為了簡單說明該問題,其實String類中並沒有value這個字段值。

安全性

String被廣泛的使用在其他Java類中充當參數。比如網絡連接、打開文件等操作。如果字符串可變,那麼類似操作可能導致安全問題。因為某個方法在調用連接操作的時候,他認為會連接到某台機器,但是實際上並沒有(其他引用同一String對象的值修改會導致該連接中的字符串內容被修改)。可變的字符串也可能導致反射的安全問題,因為他的參數也是字符串。

代碼示例:

不可變對象天生就是線程安全的

因為不可變對象不能被改變,所以他們可以自由地在多個線程之間共享。不需要任何同步處理。


總之,String被設計成不可變的主要目的是為了安全和高效。所以,使String是一個不可變類是一個很好的設計。


納尼?怎麼就沒有了呢?是不是意猶未盡?



當然本篇文章隻是Java趣味學習的冰山一角,還有更多精彩有料有趣內容,想要學好java的夥伴們還有更多福利哦,希望各位夥伴們不要錯過這次和以後的精彩內容!

我們除了有Java趣味學習文章外,還有免費的在線直播課,本次特邀某韓企世界500強資深Java架構師藍橋老師,幫助那些喜歡Java追求卓越的Java新手或者初級Java工程師們係統提升研發實力,達到一線互聯網企業中高級Java工程師的技能水平。


Java免費在線直播課


調性:我們隻想做一場有深度的技術交流分享


提示:此課程以幹貨分享為主,晚上20:30開始,每節課時長約2.5小時,因QQ群人數限製,請確認自己的需求後再進群(是否帶著Java方麵的問題來探討),把機會留給更需要的同學!


報名方式:掃描下方二維碼進群(群號:325660685



開放進群時間:2017年7月24日-7月26日 晚上18:00-22:30


若你想深度了解JAVA技術實戰,請記住上課的時間表☞


↓↓JAVA免費直播課課程內容↓↓

 

課題 : Java開發大數據搜索引擎完整版  

分享大咖: 藍橋老師 

知識點 : 從零基礎開始搭建企業級Javaee項目,數據抓取,數據檢索,網絡爬蟲,大型企業級編碼標準和規範,以及Java前景和行業發展規劃!

適合對象:適合零基礎/Java初級開發工程師

時間:7月24日  星期一 20:00-22:30

課題 : Java開發Cms高性能網頁靜態化技術   

分享大咖: 藍橋老師

知識點 : 頁麵靜態化的好處,頁麵靜態化原理與自定義組件封裝,Java網絡編程,用戶體驗優化與詳解,如何開發高質量程序與行業發展規劃

適合對象:適合零基礎/Java初級開發工程師

時間:7月25日  星期二 20:00-22:30

課題 : Java開發百度雲盤智能存儲係統    

分享大咖: 藍橋老師

知識點 : 文件的上傳下載,自定義組件封裝,Javaee項目零基礎搭建,代碼規範和優化,Java學習路線,如何提升學習效率!

適合對象:適合零基礎/Java初級開發工程師

時間:7月25日  星期二 20:00-22:30


特邀技術大咖介紹



某韓企世界500強資深Java架構師,現任國內最大在線教育學院Java學院院長,學院首席技術總監.精通java、關係型數據庫和非關係型數據庫的開發,JAVAEE專家、雲計算專家。對hadoop,mapreduce,flume,hive,pig,zookeeper,storm,kafka,openstack,spark,mahout等雲計算領域技術也有深入的了解。


讓匠心知識分享給最需要的人!

點擊"閱讀原文",也可以加入學習交流群哦~

相關文章
"在一起"後絕不是隻能進不能退2017年07月27日
【教程】如何正確使用和維護電池?手機、相機、筆記本通用2017年07月27日
孫正義最新預言:巨變即將到來,感覺睡覺都是浪費時間2017年07月27日
【CHRC分享活動】20170802-北京-管理培訓生招募與培養論壇2017年07月27日
沈從文:李白的胡子應該是翹翹的!2017年07月27日
國際奧賽再現黑馬,不過我更關心韓國數學課和中國到底有何不同?2017年07月27日
蒙牛、旺旺、可口可樂集團要做同一款產品!到底誰能贏?2017年07月27日
"我愛生活,我愛加班"2017年07月27日
好久好久沒看過這麼好的懸疑片了2017年07月27日
重回侏羅紀,你能跑贏霸王龍嗎?2017年07月27日

没有评论:

发表评论