news 2026/3/11 18:28:24

String Constant Pool

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
String Constant Pool

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

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

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

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

java

运行

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

三、关键知识点

  1. 存储位置

    • JDK 1.6 及之前:常量池位于方法区(永久代)
    • JDK 1.7 及之后:常量池被移到堆内存(更灵活,避免永久代内存溢出)。
  2. 核心方法:intern ()

    • 作用:将当前字符串对象的内容存入常量池(若不存在),并返回常量池中的引用;
    • 场景:当需要复用动态生成的字符串(比如拼接后的字符串)时,用intern()可优化内存。
  3. 字符串拼接的特殊情况

    java

    运行

    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 后常量池移至堆内存,拼接字符串的编译期 / 运行期处理逻辑不同,需注意引用对比的差异。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/10 4:13:57

凡尔赛一波:凭这份阿里Java面试突击指南,我今年已经拿了9张Offer

2025即将过去,不知道大家都拿到Offer没有,如果没有的话,希望大家不要怪LZ凡尔赛了。LZ截止今天为止已经收到了第9家公司的Offer,这张的Offer的话给到28k*14薪。由于个人原因,LZ没有去这家公司,而是选择了其…

作者头像 李华
网站建设 2026/3/10 2:46:15

Langchain-Chatchat如何实现知识库变更通知功能?

Langchain-Chatchat如何实现知识库变更通知功能? 在企业知识管理日益复杂的今天,一个智能问答系统是否“聪明”,往往不在于它能回答多少问题,而在于它能否始终给出最新、最准确的答案。尤其是在法务、医疗、金融等对信息时效性要求…

作者头像 李华
网站建设 2026/3/10 20:13:44

Langchain-Chatchat如何实现知识库操作自动化脚本?

Langchain-Chatchat如何实现知识库操作自动化脚本? 在企业知识管理的日常实践中,一个常见的困境是:大量关键文档分散在共享盘、邮件附件和个人电脑中,每当员工需要查找某个政策条款或技术规范时,往往要花费数十分钟甚至…

作者头像 李华
网站建设 2026/3/10 11:22:20

Langchain-Chatchat构建人力资源政策问答机器人的实践

Langchain-Chatchat构建人力资源政策问答机器人的实践 在一家中型科技公司的人力资源部门,每天都会收到大量重复性咨询:年假怎么算?试用期能否请婚假?加班费的计算基数是什么?尽管这些信息都写在《员工手册》里&#x…

作者头像 李华
网站建设 2026/3/8 11:44:45

Langchain-Chatchat结合Apache Airflow调度任务

Langchain-Chatchat 结合 Apache Airflow 实现知识库自动化更新 在企业内部,每天都有新的政策发布、产品迭代和制度调整。然而,这些关键信息往往以 PDF、Word 或 PPT 的形式散落在各个共享目录中,员工想查一句“年假怎么休”却要翻遍三份文档…

作者头像 李华
网站建设 2026/3/9 6:42:30

nano banana pro绘图示例

对下面方案描述进行细化。稳产期预测稳定产量、稳产期持续时间,基于压力变化趋势 生产制度,使用LSTM/Transformer(捕捉压力 - 产量时序相关性)针对您提出的稳产期预测技术方案,以下是逻辑严密、专业细化的方案描述。该…

作者头像 李华