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

 更新时间:2025年12月23日 16:12:32   作者:小CC吃豆子  
字符串常量池是JVM中用于缓存字符串的机制,可以避免重复字符串的内存浪费,通过直接赋值创建的字符串会被优先存入常量池并复用,本文介绍String Constant Pool字符串常量池代码示例,感兴趣的朋友跟随小编一起看看吧

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

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

  • 当你创建字符串(比如 String s = "hello")时,JVM 会先去常量池里找有没有内容为 "hello" 的字符串。
  • 如果有,直接返回这个字符串的引用(相当于「复用」);如果没有,就先在常量池里创建 "hello",再返回引用。
  • 而通过 new String("hello") 创建的字符串,会在 堆内存 新建对象,同时常量池里也会创建 "hello"(如果之前没有),这也是为什么 new String 会比直接赋值多占用内存。

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

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"
    }
}

三、关键知识点

  • 存储位置
    • JDK 1.6 及之前:常量池位于 方法区(永久代)
    • JDK 1.7 及之后:常量池被移到 堆内存(更灵活,避免永久代内存溢出)。
  • 核心方法:intern ()
    • 作用:将当前字符串对象的内容存入常量池(若不存在),并返回常量池中的引用;
    • 场景:当需要复用动态生成的字符串(比如拼接后的字符串)时,用 intern() 可优化内存。
  • 字符串拼接的特殊情况
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

四、实际应用价值

  • 内存优化:避免大量重复字符串占用内存(比如业务中频繁使用的固定字符串,如 "success"、"fail");
  • 性能提升:复用已有对象减少 GC(垃圾回收)压力,字符串比较时 == 比 equals 更快(但仅适用于常量池字符串)。

总结

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

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

相关文章

  • java播放声音类和一个简单示例

    java播放声音类和一个简单示例

    这篇文章主要介绍了一个java播放声音类和一个java播放声音的应用程序,应用程序可以单次播放声音、循环播放声音,需要的朋友可以参考下
    2014-03-03
  • java map转Multipart/form-data类型body实例

    java map转Multipart/form-data类型body实例

    这篇文章主要介绍了java map转Multipart/form-data类型body实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-05-05
  • Spring 中如何根据环境切换配置 @Profile

    Spring 中如何根据环境切换配置 @Profile

    这篇文章主要介绍了Spring中如何根据环境切换配置@Profile的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java从服务端下载Excel模板文件的两种方法

    Java从服务端下载Excel模板文件的两种方法

    这篇文章主要为大家详细介绍了Java从服务端下载Excel模板文件的两种方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • SpringBoot中多个实现的接口正确注入的六种方式

    SpringBoot中多个实现的接口正确注入的六种方式

    在SpringBoot中,正确注入多个接口实现包括使用@Autowired和@Qualifier、@Resource注解、构造方法注入、@Primary注解、Java配置类以及将所有实现注入到List或Map中,感兴趣的可以了解一下
    2024-10-10
  • 浅谈Java中对类的主动引用和被动引用

    浅谈Java中对类的主动引用和被动引用

    这篇文章主要介绍了浅谈Java中对类的主动引用和被动引用,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • iOS多线程介绍

    iOS多线程介绍

    这篇文章主要介绍了iOS多线程的相关知识,涉及到对进程,线程等方面的知识讲解,本文非常具有参考价值,感兴趣的朋友一起学习吧
    2016-05-05
  • JavaFX实现石头剪刀布小游戏

    JavaFX实现石头剪刀布小游戏

    这篇文章主要为大家详细介绍了JavaFX实现石头剪刀布小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • gitlab-runner结合docker部署项目全过程

    gitlab-runner结合docker部署项目全过程

    本文介绍了使用GitLab和GitLab Runner自动化构建Spring Boot项目的方法,搭建好GitLab和GitLab Runner后,在Spring Boot项目中创建.gitlab-ci.yml文件,配置脚本准备Maven编译项目、打包JAR包及运行JAR包,并在设置中配置CI/CD,这样,点击项目CI/CD即可自动化运行
    2026-05-05
  • Java制作智能拼图游戏原理及代码

    Java制作智能拼图游戏原理及代码

    本文给大家分享的是使用Java实现智能拼图游戏的原理,以及实现的源码,推荐给大家,有需要的小伙伴可以参考下。
    2015-03-03

最新评论