温馨提示×

温馨提示×

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

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

java String 什么是常量池

发布时间:2026-09-15 05:09:20 来源:亿速云 阅读:105 作者:小樊 栏目:编程语言

在 Java 中,String 常量池(String Pool,也叫字符串常量池) 是 JVM 为了提高性能、节省内存而设计的一块特殊存储区域,用来存放字符串字面量(String literal)和被显式放入池中的字符串对象。

下面从几个关键点来说明。


1️⃣ 什么是 String 常量池

字符串常量池是 JVM 中一块存储 String 对象引用的内存区域(在 JDK 7 之后位于堆中,之前在方法区/永久代)。

它的核心特点是:

相同的字符串字面量,在池中只存在一份


2️⃣ 什么时候字符串会进入常量池

✅ 情况一:使用字符串字面量(最常见)

String a = "abc";
String b = "abc";
  • "abc" 是字符串字面量
  • 第一次出现时,会创建并放入常量池
  • 第二次使用时,直接复用池中对象
System.out.println(a == b); // true

✅ 情况二:使用 String.intern()

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

System.out.println(s2 == s3); // true
  • intern():
    • 如果池中已有该字符串 → 返回池中引用
    • 如果没有 → 放入池中并返回

3️⃣ new String() 和常量池的区别(重点)

String a = "abc";
String b = new String("abc");
方式 是否在池中 是否新建对象
"abc" ✅ 在池中 ❌ 不新建(复用)
new String("abc") ❌ 不在池中 ✅ 新建堆对象
System.out.println(a == b); // false

new String("abc") 至少创建一个对象(池中可能有,也可能没有)


4️⃣ 为什么要用常量池

✅ 目的

  • 节省内存
  • 提高比较效率
  • 避免重复字符串对象

例如:

"hello"  // 成千上万次使用

如果每次都 new,内存爆炸。


5️⃣ JDK 版本变化(了解)

JDK 版本 常量池位置
JDK 6 及之前 方法区(PermGen)
JDK 7 堆(Heap)
JDK 8+ 堆(Metaspace 管理类信息,但字符串仍在堆)

6️⃣ 常见面试题总结

❓ == 和 equals 区别?

==      // 比较引用(地址)
equals  // 比较内容

❓ 下面输出什么?

String s1 = "a" + "b";
String s2 = "ab";

System.out.println(s1 == s2); // true(编译期优化)

❓ 下面输出什么?

String s1 = "a";
String s2 = s1 + "b";

System.out.println(s2 == "ab"); // false

7️⃣ 一句话总结

String 常量池是 JVM 用来存储字符串字面量、避免重复创建字符串对象的一块内存区域;使用字面量或 intern() 才能进入池中。

如果你愿意,我可以:

  • 画内存图说明
  • 讲 StringBuilder 和常量池关系
  • 出几道 Java 字符串面试题练手
向AI问一下细节

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

AI
助
手