在 Java 中,String 为什么要区分“字面量(String literal)”,本质上是为了性能、内存复用和语言设计上的便利性。下面从几个关键点解释。
String a = "abc"; // "abc" 是字符串字面量
String b = new String("abc"); // 通过 new 创建
"xxx")new、拼接、IO、网络等方式生成的字符串Java 在设计时就规定:
字符串字面量会进入字符串常量池(String Pool),并且可复用
String a = "abc";
String b = "abc";
System.out.println(a == b); // true
原因:
"abc" 在编译期就确定a 和 b 指向同一个对象✅ 好处:
== 可直接判断)new String() 不走池(默认)String a = "abc";
String b = new String("abc");
System.out.println(a == b); // false
new String("abc"):
"abc"✅ 设计目的:
String 是 不可变类,这是池化的前提:
String a = "abc";
// a 不能被修改,只能重新赋值
如果 String 可变:
✅ 不可变 + 常量池 = 安全共享
String a = "a" + "b" + "c";
// 编译后等价于
String a = "abc";
但:
String x = "a";
String y = x + "b"; // 运行时拼接,不在池里
intern() 的作用(手动入池)String s = new String("abc").intern();
"abc",返回池中对象常用于:
Java 区分 String 字面量,是为了通过“字符串常量池”实现内存复用、性能优化,同时保证 String 不可变下的安全共享。
简单对比:
| 方式 | 是否入池 | 是否复用 | 性能 |
|---|---|---|---|
"abc" |
✅ | ✅ | 高 |
new String("abc") |
❌(默认) | ❌ | 低 |
intern() |
✅ | ✅ | 中 |
如果你愿意,我也可以从 JVM 内存结构 / 字节码 / 面试角度再深入讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。