温馨提示×

温馨提示×

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

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

java String 为何分字面量

发布时间:2026-10-05 23:03:26 来源:亿速云 阅读:98 作者:小樊 栏目:编程语言

在 Java 中,String 为什么要区分“字面量(String literal)”,本质上是为了性能、内存复用和语言设计上的便利性。下面从几个关键点解释。


1. 什么是 String 字面量

String a = "abc";        // "abc" 是字符串字面量
String b = new String("abc"); // 通过 new 创建
  • 字面量:直接写在代码里的字符串("xxx")
  • 非字面量:通过 new、拼接、IO、网络等方式生成的字符串

2. 核心原因一:字符串常量池(String Pool)

Java 在设计时就规定:

字符串字面量会进入字符串常量池(String Pool),并且可复用

String a = "abc";
String b = "abc";
System.out.println(a == b); // true

原因:

  • "abc" 在编译期就确定
  • 类加载时放入 字符串常量池
  • a 和 b 指向同一个对象

✅ 好处:

  • 节省内存
  • 比较更快(== 可直接判断)
  • 适合大量重复字符串场景(配置、SQL、JSON key 等)

3. 核心原因二:new String() 不走池(默认)

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

System.out.println(a == b); // false
  • new String("abc"):
    • 先在池中找 "abc"
    • 再在堆中新建一个 String 对象
  • 结果:两个对象

✅ 设计目的:

  • 给开发者“强制新建对象”的能力
  • 避免所有字符串都被共享(某些场景需要独立对象)

4. 核心原因三:不可变(Immutable)+ 池化才安全

String 是 不可变类,这是池化的前提:

String a = "abc";
// a 不能被修改,只能重新赋值

如果 String 可变:

  • 一个地方改了,所有引用都受影响 ❌
  • 池化会非常危险

✅ 不可变 + 常量池 = 安全共享


5. 编译期优化(常量折叠)

String a = "a" + "b" + "c";
// 编译后等价于
String a = "abc";
  • 字面量拼接在编译期完成
  • 仍然进入常量池

但:

String x = "a";
String y = x + "b"; // 运行时拼接,不在池里

6. intern() 的作用(手动入池)

String s = new String("abc").intern();
  • 如果池中已有 "abc",返回池中对象
  • 否则放入池中

常用于:

  • 大量动态字符串去重
  • 节省内存(如日志系统)

7. 总结一句话

Java 区分 String 字面量,是为了通过“字符串常量池”实现内存复用、性能优化,同时保证 String 不可变下的安全共享。

简单对比:

方式 是否入池 是否复用 性能
"abc" ✅ ✅ 高
new String("abc") ❌(默认) ❌ 低
intern() ✅ ✅ 中

如果你愿意,我也可以从 JVM 内存结构 / 字节码 / 面试角度再深入讲。

向AI问一下细节

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

AI
助
手