温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

字符串常量池是什么

发布时间:2026-07-25 03:21:51 来源:亿速云 阅读:104 作者:小樊 栏目:编程语言

字符串常量池(String Constant Pool) 是 Java 中一块特殊的内存区域,用于存储字符串字面量(String literals)和某些字符串对象,目的是避免重复创建相同内容的字符串对象,节省内存、提高性能。


一、字符串常量池在哪里?

  • JDK 7 之前:字符串常量池位于 方法区(永久代 PermGen)
  • JDK 7 及之后:字符串常量池被移到 堆(Heap)中

原因:永久代空间有限,容易 OOM;放到堆中便于 GC 管理。


二、字符串常量池的作用

✅ 核心作用:字符串复用(intern)

String s1 = "abc";
String s2 = "abc";

System.out.println(s1 == s2); // true
  • "abc" 是字符串字面量
  • 第一次出现时,会在字符串常量池中创建
  • 第二次再使用 "abc" 时,直接复用池中已有的对象
  • == 比较的是引用地址,因此为 true

三、字符串对象的两种创建方式

1️⃣ 字面量方式(进入常量池)

String s1 = "abc";
  • 编译期确定
  • 如果常量池中不存在 "abc",就创建
  • 存在则直接引用

2️⃣ new 方式(在堆中创建对象)

String s2 = new String("abc");
  • 一定会在堆中创建一个新的 String 对象
  • 如果 "abc" 在常量池中不存在,也会在常量池中创建一个
  • 但 s2 指向的是堆中的对象,不是常量池中的
String s1 = "abc";
String s2 = new String("abc");

System.out.println(s1 == s2); // false

四、intern() 方法(重点)

String s1 = new String("abc");
String s2 = s1.intern();

System.out.println(s1 == s2); // false
System.out.println("abc" == s2); // true

intern() 做了什么?

  • 如果常量池中已有该字符串 → 返回池中对象的引用
  • 如果常量池中没有 → 把字符串加入池中,再返回引用

五、字符串常量池的特点总结

✅ 字符串不可变(immutable)
✅ 池中的字符串可以被多个引用共享
✅ 字面量自动入池
✅ new String() 不一定入池
✅ intern() 可手动入池


六、常见面试题

❓ 下面创建了多少个对象?

String s = new String("abc");

✅ 1 或 2 个

  • "abc" 字面量:1 个(如果之前没有)
  • new String():1 个(堆中)

❓ 为什么 String 要设计成不可变?

  • 支持字符串常量池
  • 线程安全
  • 缓存 hash 值
  • 类加载机制依赖字符串

七、一句话总结

字符串常量池是 Java 为了复用字符串对象、节省内存而设计的一块内存区域,主要存放字符串字面量和 intern 后的字符串。

如果你愿意,我也可以:

  • 用 内存图 给你画一遍
  • 对比 Java / C++ 字符串
  • 讲 JDK 7/8/17 的变化
  • 结合 实习 / 面试常问点 讲
向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手