最核心区别是对象创建位置和数量不同:字面量“hello”直接入常量池(JDK7+在堆中),s1指向池中唯一实例;new String("hello")必在堆新建对象,即使池中已有也会额外创建,故s1 == s2恒为false,但equals为true。

最核心的区别在于对象创建位置和数量不同,直接影响 == 比较结果和内存使用效率。
内存分配位置不同
“hello”字面量直接进入字符串常量池(JDK 7+ 在堆中),s1 指向的就是这个池中的唯一实例;而 new String("hello") 一定在堆中新建一个独立的 String 对象,其内部 value 字段可能复用常量池里的字符数组,但对象本身是全新的。
创建的对象数量不同
这取决于常量池中是否已存在 "hello":
-
String s1 = "hello";:最多创建 0 或 1 个对象(仅当常量池无该字符串时才新建) -
String s2 = new String("hello");:至少创建 1 个对象(堆中新的 String 实例),如果常量池没有 "hello",还会额外创建 1 个(即共 2 个)
== 比较结果必然不同
== 判断的是引用是否指向同一块内存地址:
-
s1 == s2一定是 false,因为一个指向常量池,一个指向堆中新对象 -
s1.equals(s2)是 true,因为 String 的equals()重写为比较内容而非地址 - 多个字面量赋值(如
String a="hello"; String b="hello";)之间a == b为 true
实际开发建议
除非有明确需求(比如需要两个内容相同但地址不同的字符串用于测试或特定逻辑),否则优先使用字面量方式创建字符串:
- 更省内存,避免冗余对象
- 性能更好(无 new 开销,无额外堆分配)
- 语义更清晰,符合字符串不可变与共享的设计初衷
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











