字符串字面量与 new String("i") 一样吗?
查看完整题解
参考回答
直接回答
它们表示的字符内容可以相同,但对象身份不一定相同。字符串字面量与字符串常量表达式会使用驻留字符串;new String("i") 则显式创建一个新的 String 对象。因此常见情况下二者用 equals 比较为 true,用 == 比较为 false。
讲清原理
String 不可变,使多个地方共享同一个字符串值更容易安全实现。字符串池可以复用相同内容的驻留实例,但 new 表达式仍有自己的对象创建语义。不要把“内容在池中”与“每个变量必然指向池中那个实例”混在一起。
也不要死背“这一行永远创建两个对象”。字面量对应的驻留实例可能早已存在,具体统计还取决于你讨论的范围。intern() 可以取得内容对应的驻留引用,但业务内容比较通常不需要依赖它。
例子与易错点
String a = "i";
String b = new String("i");
System.out.println(a == b); // false
System.out.println(a.equals(b)); // true
System.out.println(a == b.intern()); // true
只有编译期常量表达式才有相应的常量折叠规则,不能把所有运行时拼接结果都当成相同池引用。
相关题:第 13 题、第 44 题。
这道题,你掌握得怎么样?
掌握程度由你主动标记,阅读和收藏不会自动改变状态。