温馨提示×

温馨提示×

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

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

java String 为何分常量池

发布时间:2026-10-26 13:28:04 来源:亿速云 阅读:88 作者:小樊 栏目:编程语言

在 Java 中,String 被设计成放入“常量池(String Pool / 常量池)”,主要是出于性能、内存节省和设计语义三方面的考虑。下面分层说明。


一、最根本原因:String 是不可变的(immutable)

String a = "abc";
String b = "abc";

Java 的 String 对象一旦创建就不能修改内容。
因为不可变,所以:

  • 多个变量共享同一个字符串对象是安全的
  • 不用担心某个地方改了字符串影响其他引用

➡ 这就为“字符串复用”提供了前提条件。


二、字符串常量池的作用:避免重复创建对象

没有常量池会怎样?

String a = new String("abc");
String b = new String("abc");

如果没有常量池:

  • 每次都会 new 一个新对象
  • 内存中存在大量内容相同的字符串
  • GC 压力大

有常量池后

String a = "abc";
String b = "abc";
  • a == b 为 true
  • 只创建一个 "abc" 对象
  • 后续直接复用

✅ 节省内存
✅ 提升比较效率(== 可用)


三、常量池的设计来源:编译期优化

String s = "hello";
  • "hello" 在 编译期 就被放入 class 文件的常量池
  • 类加载时进入 运行时常量池(JVM 方法区 / 元空间)
  • 首次使用时在堆中创建 String 对象并放入 String Pool

这是 JVM 层面的优化机制。


四、String 两种创建方式的区别

1️⃣ 字面量(使用常量池)

String a = "abc";

✅ 优先从常量池取
✅ 没有才创建


2️⃣ new 方式(不在常量池)

String b = new String("abc");
  • 一定在堆中创建新对象
  • 如果常量池没有 "abc",也会顺带创建

✅ 可用 intern() 手动入池:

b = b.intern();

五、为什么只有 String 有“常量池”?

因为 String 具备:

特性 说明
不可变 可安全共享
高频使用 几乎所有程序都用
可预测 编译期可知内容

其他对象一般不满足这些。


六、一句话总结

Java 把 String 放入常量池,是因为 String 不可变、使用频繁,通过池化可以大幅减少内存占用并提升性能。

如果你愿意,我也可以从 JVM 内存结构 / intern 原理 / 面试角度 再展开讲。

向AI问一下细节

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

AI
助
手