淺談java String不可變的好處
一、java內(nèi)部String類的實(shí)現(xiàn):
java 8:
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final char value[]; }
java 9 及之后:(使用coder標(biāo)識了編碼)
public final class String implements java.io.Serializable, Comparable<String>, CharSequence { /** The value is used for character storage. */ private final byte[] value; /** The identifier of the encoding used to encode the bytes in {@code value}. */ private final byte coder; }
二、為何要將String定義為final不可變?
因?yàn)樵诔绦蚓帉懙倪^程中,會大量地用到String常量,如果每次聲明一個String引用都要新建一個String對象,那么會造成空間的極大浪費(fèi)。于是,在java的堆中開辟了一塊存儲空間String pool,用于存儲String常量對象。當(dāng)有多個String引用指向同樣的String字符串時,實(shí)際上是指向的是同一個Sting pool中的對象,而不需要額外的創(chuàng)建對象。
public class Test{ public static void main(String [] args){ String a="abc"; String b="abc";//對象保存在string pool中 String c=new String("abc");//以new創(chuàng)建的對象保存在堆中 System.out.println("a==b:"+(a==b)); System.out.println("a==c:"+(a==c)); } }
實(shí)現(xiàn)String pool就需要String定義為final,否則,當(dāng)引用a、b都指向“abc”時,通過a將對象改變后,引用b所指向的對象被動地改變了。那程序員不得氣得半死?
三、String不可變的其他好處
1、以String作為HashMap的key,String的不可變保證了hash值的不可變。
2、String作為網(wǎng)絡(luò)連接的參數(shù),它的不可變性提供了安全性。
3、String不可變,所以線程安全。
以上所述是小編給大家介紹的java String不可變的好處詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
解決Springboot啟動報錯:類文件具有錯誤的版本61.0,應(yīng)為?52.0
這篇文章主要給大家介紹了關(guān)于解決Springboot啟動報錯:類文件具有錯誤的版本?61.0,應(yīng)為?52.0的相關(guān)資料,這是查閱了網(wǎng)上的很多資料才解決的,分享給大家,需要的朋友可以參考下2023-01-01JavaIO?BufferedReader和BufferedWriter使用及說明
這篇文章主要介紹了JavaIO?BufferedReader和BufferedWriter使用及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-12-12SpringCloud+MyBatis分頁處理(前后端分離)
這篇文章主要為大家詳細(xì)介紹了SpringCloud+MyBatis分頁處理,前后端分離,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-10-10Java中Runnable與Callable接口的區(qū)別詳解
這篇文章主要為大家詳細(xì)介紹了Java中Runnable與Callable接口的區(qū)別,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定的幫助,需要的可以參考一下2023-03-03Spring Native項目實(shí)戰(zhàn)(體驗(yàn)79毫秒啟動springboot應(yīng)用)
Spring Native是Spring提供的、制作native image的技術(shù)方案,本篇主要內(nèi)容是開發(fā)springboot應(yīng)用再構(gòu)建為native image的方法,通過Spring Native項目實(shí)戰(zhàn)讓大家體驗(yàn)79毫秒啟動springboot應(yīng)用,感興趣的朋友跟隨小編一起看看吧2021-05-05SpringCloud FeignClient 超時設(shè)置
FeignClient?默認(rèn)的超時時間可能不滿足你的需求,你可以通過幾種方式來自定義這些超時設(shè)置,具有一定的參考價值,感興趣的可以了解一下2024-08-08IntelliJ IDEA 2020.2 配置大全詳細(xì)圖文教程(更新中)
這篇文章主要介紹了IntelliJ IDEA 2020.2 配置大全(更新中),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08springboot之SpringApplication生命周期和事件機(jī)制解讀
這篇文章主要介紹了springboot之SpringApplication生命周期和事件機(jī)制,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-06-06學(xué)習(xí)SpringBoot容器功能及注解原理
這篇文章主要介紹了學(xué)習(xí)SpringBoot容器功能及注解原理,文中通過詳細(xì)的代碼示例對SpringBoot容器功能及注解原理進(jìn)行了解析,有需要的朋友可以借鑒參考下2021-09-09