在 Java 中,使用 new String("abc") 创建字符串对象时,是否创建两个对象取决于字符串常量池中是否已存在 "abc"。以下是具体分析:
当字符串常量池中不存在 "abc" 时,执行 new String("abc") 会创建两个对象:
new 关键字会在堆中创建一个新的 String 对象,内容复制自常量池中的 "abc"。示例:
String s = new String("abc");此时内存中生成两个对象:
new 生成的新 String 对象 当字符串常量池中已存在 "abc" 时,执行 new String("abc") 仅创建一个对象:
new 在堆中创建新的 String 对象,但不会重复生成常量池中的 "abc"。示例:
String s1 = "abc"; // 常量池生成 "abc"
String s2 = new String("abc"); // 仅堆中生成新对象此时 s2 指向堆中的新对象,而常量池中的 "abc" 已存在
new 的行为:强制在堆中生成新对象,与常量池无关。即使内容相同,new 的对象地址也不同(== 比较为 false) 通过以下代码可验证两种场景:
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == s2); // false(地址不同)
System.out.println(s1.equals(s2)); // true(内容相同)s1 直接指向常量池中的 "abc"。s2 指向堆中的新对象,但内容与常量池一致 new String("abc") 最多可能创建两个对象,具体取决于常量池状态。String s = "abc"),避免不必要的堆对象开销原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。