字面量创建字符串走常量池,自动复用,s == t 为 true;new String() 强制在堆中新建对象,s == t 恒为 false,仅极少数需物理隔离时使用。

Java 中创建 String 字符串,字面量(如 "abc")和 new String("abc") 看似结果一样,但底层行为完全不同——关键在对象位置、复用逻辑和比较结果。
字面量方式:走常量池,自动复用
写法:String s = "hello";
JVM 会先检查字符串常量池中是否已有内容为 "hello" 的对象:
- 有,就直接让
s引用池中那个对象; - 没有,就在常量池中新建一个,并让
s指向它; - 后续再写
String t = "hello";,t和s指向同一块内存,所以s == t为 true。
new String() 方式:强制堆中新建对象
写法:String s = new String("hello");
每次执行都会在堆内存中创建一个全新 String 实例:
- 不管常量池里有没有
"hello",堆中一定新增一个对象; - 如果常量池中尚无该字符串,还会顺带把
"hello"放进池里(即最多创建两个对象); - 两个
new String("hello")得到的对象地址不同,s == t永远是 false; - 但它们内容相同,
s.equals(t)仍为 true。
怎么选?看实际需求
日常开发中:
- 固定值、配置项、状态码等,一律用字面量——省空间、快、语义清晰;
-
new String()几乎不用,仅在极少数场景需要“物理隔离”时才考虑,比如绕过某些基于引用判断的安全校验; - 误用
new String("abc")不会报错,但会多占内存、增加 GC 压力,属于隐性性能坑。
不复杂但容易忽略。


















