java運行時常量池簡單介紹

java有兩種常量池:

1靜態常量池。

靜態常量池即*.class文件中的常量池,不僅僅包含字符串(數字)字面量,還包含字段,類、方法的信息(符號引用),佔用class文件絕大部分空間,類加載過程中會把class文件中靜態常量池的內容轉移到運行時常量池,把符號引用轉爲直接引用。

2運行時常量池

java一共實現了6中基本類型的常量池:Byte , Short,Integer,Long,Boolean,Characher。(Double和Float沒有實現)
1種String的常量池。

運行時常量池在哪:

Java6,運行時常量池是存放在方法區中的。
Java7及以後,將運行時常量池是存放到了堆中。

基本類型常量池:

和String常量池不同,基本類型的常量池只能儲存 -128到127之間的常量(這也正是爲什麼Double和Float這種浮點數沒有常量池的原因)
當你Integer a = 127;Integer b = 127;a和b會自動拆箱,會指向常量池中創建好的127常量,所以他們a==b爲true;
但是當你Integer a = 128;Integer b = 128;超過了-128到127這個範圍,它們就不會自動拆箱了,會在堆內存裏面直接new對象,
這時候他們就和普通的類對象沒有區別,用等號比較的只是他們指向的內存地址而已

String常量池:

String常量池可以儲存各種不同大小的String常量,String str1 = “abc”時,他會在常量池創建abc這個字符串常量對象,並指向它
但你再次String str2 = “abc”時,先會去檢查常量池是否有abc這個常量,由於常量池裏已經有abc了,str2也直接指向同一個abc常量
正因爲他們指向的內存相等,str==str1爲true,而不是因爲他們的內容相等所致

深入理解字符串常量池和intern方法強烈建議我寫的另一篇文章:https://blog.csdn.net/qq_42862882/article/details/89179394

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章