当前位置: 首页 > news >正文

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 后常量池移至堆内存,拼接字符串的编译期 / 运行期处理逻辑不同,需注意引用对比的差异。
http://www.cnnetsun.cn/news/161407.html

相关文章:

  • Python 3.10.5使用lxml库的xpath用法
  • Langchain-Chatchat如何设置问答结果的置信度显示?
  • 33、Windows 8使用指南:系统升级、数据迁移与常用术语解析
  • Langchain-Chatchat支持多模态输入吗?图像理解进展
  • SenseGlove R1外骨骼手套专为机器人遥操作设计
  • Langchain-Chatchat如何实现问答结果的语音播报?
  • 67、Windows 7 磁盘管理与维护:压缩、加密与日常保养
  • 76、Windows 7 网络设置、版本升级及启动环境全解析
  • 91、桌面环境与System V打印系统全解析
  • 99、X Window System 全面指南
  • Langchain-Chatchat如何实现增量式知识更新?
  • 156道JVM面试合集(典藏版)
  • Langchain-Chatchat能否导出知识图谱可视化结果?
  • Spring boot社区医院管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • 前后端分离MVC自习室管理和预约系统系统|SpringBoot+Vue+MyBatis+MySQL完整源码+部署教程
  • 【必收藏】LangGraph深度研究智能体实战:LangChain官方OpenDeepResearch完整源码解析与本地部署指南
  • 清华/人大/新国大联合发布:AI Agent记忆系统全面解析,解决灾难性遗忘与上下文溢出问题
  • Langchain-Chatchat如何评估知识库问答的准确性?
  • 大语言模型的 “思考” 秘密:一文读懂 prompt 工程核心逻辑
  • Langchain-Chatchat支持Excel表格内容作为知识源吗?
  • 多智能体系统在竞争优势分析中的应用:寻找护城河
  • AI生成的音乐,到底能商用吗
  • Linux GPIO-KEYS
  • OmniThoughtV:面向多模态深度思考的高质量数据蒸馏
  • 面试不是考试,而是“技术交流与信任构建”
  • 45、WPF 打印与 XPS 文档处理全解析
  • 46、WPF应用开发:从打印到过渡效果与世界浏览器应用构建
  • 【仿真测试】基于FPGA的完整64QAM通信链路实现,含频偏锁定,帧同步,定时点,Viterbi译码,信道,误码统计
  • Day35:DMA 原理与架构
  • Java如何通过组件优化WebUploader分片上传效率?