String str=new String("hello")创建了几个对象?
String str="abc"呢?创建了几个对象?
✅ String str = new String("hello") 创建了几个对象?
✅ 答案:通常是创建了 2 个对象
🔍 分析过程:
String str = new String("hello");
JVM 执行步骤:
"hello" 是字符串字面量,会被编译器放入 字符串常量池(如果还没有);
new String("hello") 会:
在堆上创建一个新的 String 对象;
其内部 char[] 会复用常量池中 "hello" 的字符数组(JDK 9+ 为 byte[]);
所以:
常量池中有一个对象:"hello"
堆中又创建了一个新的 String 实例,内容一样,但不是同一个引用
✅ 总结:
🔸 共创建 2 个对象(常量池 1 个 + 堆中 1 个)
✅ String str = "abc" 创建了几个对象?
✅ 答案:最多创建 1 个对象
🔍 分析过程:
String str = "abc";
"abc" 是一个编译期可确定的字面量,会被放入 .class 文件的常量池中;
类加载时 JVM 会把它加载到运行时的字符串常量池中;
变量 str 直接指向这个池中的字符串对象;
如果常量池中已经存在 "abc",则不会重复创建。
✅ 总结:
🔸 只会创建 1 个对象(且只在第一次使用时创建)
🧠 对比总结
🧪 小测试
堆 vs 常量池引用是否相同:
public class Test {
public static void main(String[] args) {
String a = "hello";
String b = new String("hello");
System.out.println(a == b); // false
System.out.println(a == b.intern()); // true
}
}
评论区