Java 的 String与常量池

xiaoxiao2021-02-28  78

String str = "Hello"; /** * 与创建字符串常量不同的是,不管常量池中是否存在相同的字符串,都会在堆内存中创建新的字符串对象 */ String b = new String("Icon"); /** * java虚拟机JVM内部维护了一个字符串常量池,每当创建字符串常量时,JVM会到字符串常量池中检查, * 如果常量池中存在,返回常量池中的字符串对象引用,不存在则创建一个新的字符串对象放入常量池中 * **/ String c = "Icon"; /**intern方法返回字符串对象在字符串常量池中的对象引用,若字符串常量池中尚未有此字符串, 则创建一个新的字符串对象放入常量池中 **/ String d = b.intern(); //比较堆中b字符串对象在常量池中的引用 和 c字符串值 ,intern方法返回常量池中相同的字符串应用对象 //所以 b.intern()返回的对象 和 c 引用的对象是同一个

System.out.println(b.intern() == c);

System.out.println(d == c); /** * 把常量pool 和 c字符串对比,两者引用的都是常量池中的字符串对象Icon,所以是相等的 */ System.out.println(pool == c); /** * 实际声明一个字符串字面量s时,s是存在栈中保存了一个指向方法区中常量池里的一个地址。 * 当字符串进行拼接时,如果是单纯的已知字面量拼接,在编译期间,编译器会自动将拼接结果在常量池搜索并存入, * 如果是字符串和变量、对象拼接时,由于变量和对象是不可预知部分,编译器不会进行优化,需等待运行时才能知道变量、对象地址, * 所以jvm在运行时才将拼接结果开辟新的堆内存地址并存入结果值。 */

转载请注明原文地址: https://www.6miu.com/read-74498.html

最新回复(0)