新聞中心
java常量池是一個(gè)經(jīng)久不衰的話題,也是面試官的最愛,題目花樣百出,這次好好總結(jié)一下。
理論
先拙劣的表達(dá)一下jvm虛擬內(nèi)存分布:
程序計(jì)數(shù)器是jvm執(zhí)行程序的流水線,存放一些跳轉(zhuǎn)指令,這個(gè)太高深,不懂。
本地方法棧是jvm調(diào)用操作系統(tǒng)方法所使用的棧。
虛擬機(jī)棧是jvm執(zhí)行java代碼所使用的棧。
方法區(qū)存放了一些常量、靜態(tài)變量、類信息等,可以理解成class文件在內(nèi)存中的存放位置。
虛擬機(jī)堆是jvm執(zhí)行java代碼所使用的堆。
Java中的常量池,實(shí)際上分為兩種形態(tài):靜態(tài)常量池和運(yùn)行時(shí)常量池。
所謂靜態(tài)常量池,即*.class文件中的常量池,class文件中的常量池不僅僅包含字符串(數(shù)字)字面量,還包含類、方法的信息,占用class文件絕大部分空間。
而運(yùn)行時(shí)常量池,則是jvm虛擬機(jī)在完成類裝載操作后,將class文件中的常量池載入到內(nèi)存中,并保存在方法區(qū)中,我們常說的常量池,就是指方法區(qū)中的運(yùn)行時(shí)常量池。
接下來我們引用一些網(wǎng)絡(luò)上流行的常量池例子,然后借以講解。
String s1 = "Hello"; String s2 = "Hello"; String s3 = "Hel" + "lo"; String s4 = "Hel" + new String("lo"); String s5 = new String("Hello"); String s6 = s5.intern(); String s7 = "H"; String s8 = "ello"; String s9 = s7 + s8; System.out.println(s1 == s2); // true System.out.println(s1 == s3); // true System.out.println(s1 == s4); // false System.out.println(s1 == s9); // false System.out.println(s4 == s5); // false System.out.println(s1 == s6); // true
當(dāng)前文章:Java常量池知識(shí)點(diǎn)總結(jié)-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://www.dlmjj.cn/article/ddjdsi.html