Java 常量池的實例詳解
Java 常量池的實例詳解
Java的常量池中包含了類、接口、方法、字符串等一系列常量值。常量池在編譯期間就已經(jīng)確定,并保存在*.class文件中
一、對于相同的常量值,常量池中只保存一份拷貝。
而且,當(dāng)一個字符串由多個字符串常量鏈接而成時,多個字符串被組成一個字符串常量。
例如:
package lxg; public class main { public static void main(String[] args) { String name = "lengxuegang"; String nickname = "lengxuegang"; String signature = "leng" + "xue" + "gang"; System.out.println(name == nickname); System.out.println(name == signature); } }
結(jié)果為:
true true
注意:由new String()創(chuàng)建的字符串不是常量,不能在編譯期間確定。因此也就不能放入常量池中,而是有自己的地址空間。
二、常量池在運(yùn)行期間由JVM裝載,并且可以擴(kuò)充。
String.intern()方法就是擴(kuò)充常量池的一個方法。當(dāng)String的一個對象str調(diào)用intern()方法時,Java首先檢索常量池中是否有相同Unicode編碼的字符串常量。如果有,則返回該字符串常量的引用;如果沒有,則在常量池中增加一個Unicode編碼等于str的字符串常量,同時返回該字符串常量的引用。
例如:
package lxg; public class main { public static void main(String[] args) { String name = "lengxuegang"; String nickname = new String("lengxuegang"); System.out.println(name == nickname); //調(diào)用intern方法后,nickname指向常量池中"lengxuegang"的引用,此時name與nickname相同 nickname = nickname.intern(); System.out.println(name == nickname); } }
輸出結(jié)果為:
false true
如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
Spring Boot中數(shù)據(jù)庫操作Druid和HikariDataSource的詳細(xì)過程
這篇文章主要介紹了Spring Boot中數(shù)據(jù)庫操作Druid和HikariDataSource的詳細(xì)過程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06解析Java實現(xiàn)設(shè)計模式六大原則之里氏替換原則
里氏替換原則是用來幫助我們在繼承關(guān)系中進(jìn)行父子類的設(shè)計。它闡述了有關(guān)繼承的一些原則,也就是什么時候應(yīng)該使用繼承,什么時候不應(yīng)該使用繼承,以及其中蘊(yùn)含的原理。它是繼承復(fù)用的基礎(chǔ),反映了基類與子類之間的關(guān)系,是對開閉原則的補(bǔ)充,對實現(xiàn)抽象化具體步驟的規(guī)范2021-06-06java中線程的sleep()方法和yield()方法的區(qū)別
本文主要介紹了java中線程的sleep()方法和yield()方法的區(qū)別,Thread類的sleep()方法使線程休眠指定時間,不釋放鎖,而yield()提示調(diào)度器當(dāng)前線程愿意讓出CPU資源,不保證立即切換線程,感興趣的可以了解一下2024-10-10