java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > String Constant Pool字符串常量池

String Constant Pool字符串常量池代码示例

作者:小CC吃豆子

字符串常量池是JVM中用于缓存字符串的机制,可以避免重复字符串的内存浪费,通过直接赋值创建的字符串会被优先存入常量池并复用,本文介绍String Constant Pool字符串常量池代码示例,感兴趣的朋友跟随小编一起看看吧

一、核心概念(通俗解释)

可以把字符串常量池理解成一个「字符串缓存池」:

二、代码示例:直观理解常量池机制

public class StringConstantPoolDemo {
    public static void main(String[] args) {
        // 方式1:直接赋值,字符串存入常量池,复用已有对象
        String s1 = "hello";
        String s2 = "hello";
        // 方式2:new 创建,堆内存新建对象,常量池仍会存"hello"(若不存在)
        String s3 = new String("hello");
        String s4 = new String("hello");
        // 对比引用(== 比较对象地址,equals 比较内容)
        System.out.println(s1 == s2);       // true:s1和s2指向常量池同一个"hello"
        System.out.println(s1 == s3);       // false:s1指向常量池,s3指向堆内存对象
        System.out.println(s3 == s4);       // false:s3和s4是堆里两个不同对象
        System.out.println(s1.equals(s3));  // true:内容相同
        // intern() 方法:将堆中的字符串对象"入池",返回常量池引用
        String s5 = s3.intern();
        System.out.println(s1 == s5);       // true:s5现在指向常量池的"hello"
    }
}

三、关键知识点

String s1 = "a" + "b";  // 编译期优化,直接等同于"ab",存入常量池
String s2 = "ab";
System.out.println(s1 == s2);  // true
String a = "a";
String b = "b";
String s3 = a + b;  // 运行期拼接,会new String("ab"),存在堆中
System.out.println(s3 == s2);  // false
System.out.println(s3.intern() == s2);  // true

四、实际应用价值

总结

  1. 字符串常量池是 JVM 优化字符串内存的缓存机制,直接赋值的字符串会优先存入常量池并复用;
  2. new String() 会在堆创建新对象,可通过 intern() 方法将内容入池复用;
  3. JDK 1.7 后常量池移至堆内存,拼接字符串的编译期 / 运行期处理逻辑不同,需注意引用对比的差异。

到此这篇关于String Constant Pool字符串常量池代码示例的文章就介绍到这了,更多相关String Constant Pool字符串常量池内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文