字符串常量池
1.Java中兩種創(chuàng)建字符串對象的方式的分析
直接用字面量的方式創(chuàng)建一個(gè)字符串(String a = "hello"),
這種方式創(chuàng)建的字符串是直接存在字符串常量池中徽级,這種方式會(huì)先去字符串常量池中查看"hello"是否存在气破,
如果存在的話會(huì)先去直接返回hello的引用地址給a,
2.通過String的構(gòu)造方法創(chuàng)建(String a = new String(“hello”))
首先會(huì)創(chuàng)建hello對象在堆中餐抢,然后在字符串常量池中創(chuàng)建一個(gè)對象现使,該對象指向于hello堆中hello對象,
2.字符串常量池存儲(chǔ)的位置
在jdk1.6的時(shí)候旷痕,字符串常量池是存儲(chǔ)在方法區(qū)的碳锈,然后在jdk1.7的時(shí)候,字符串常量池就改為在堆中欺抗,
class常量池
java類被編譯后售碳,就生成了.class文件,class文件中存在了類的信息,方法贸人。接口间景。字段等描述,還有一項(xiàng)就是常量池艺智,常量池中存的就是一些字面量(字符串倘要,基本數(shù)據(jù)類型,final常量)十拣,以及符號(hào)引用(類路勁封拧,方法和字段的描述符和名稱),每一個(gè)class文件都有自己的class常量池夭问,
運(yùn)行時(shí)常量池
類加載通過類的全路徑找到class文件泽西,然后以二進(jìn)制流的方式加載class文件,然后經(jīng)過一系列的驗(yàn)證甲喝,連接尝苇,解析铛只,初始化等操作解析class文件埠胖,在解析的時(shí)候class文件中的常量池就會(huì)被解析為運(yùn)行時(shí)常量池,運(yùn)行時(shí)常量池其實(shí)class常量池被類加載加載后的狀態(tài)淳玩,class常量池中的符號(hào)引用直撤,有一些會(huì)被解析為直接引用(就是直接引用于對象的位置)
運(yùn)行時(shí)常量池和class常量池的區(qū)別就在于其動(dòng)態(tài)性,class常量池又叫做靜態(tài)常量池蜕着,池中的常量是預(yù)先設(shè)置好的谋竖,那么運(yùn)行時(shí)常量池是可以后期動(dòng)態(tài)的向常量池中添加常量,比如String.intern()就是典型的向運(yùn)行時(shí)常量池中添加常量的方法
常量池的好處
1.節(jié)省內(nèi)存空間承匣,同樣的字符串在常量中只有一份蓖乘,并且只會(huì)分配一次內(nèi)存空間
2.避免了頻繁的創(chuàng)建和銷毀常量對系統(tǒng)帶的來性能影響,