侧边栏壁纸
博主头像
ProSayJ 博主等级

Talk is cheap. Show me the code.

  • 累计撰写 55 篇文章
  • 累计创建 20 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

创建了几个对象?

YangJian
2025-07-02 / 0 评论 / 0 点赞 / 1 阅读 / 0 字
  1. String str=new String("hello")创建了几个对象?

  2. String str="abc"呢?创建了几个对象?


✅ String str = new String("hello") 创建了几个对象?

✅ 答案:通常是创建了 2 个对象

🔍 分析过程:

String str = new String("hello");

JVM 执行步骤:

  1. "hello" 是字符串字面量,会被编译器放入 字符串常量池(如果还没有);

  2. new String("hello") 会:

  • 在堆上创建一个新的 String 对象;

  • 其内部 char[] 会复用常量池中 "hello" 的字符数组(JDK 9+ 为 byte[]);

  1. 所以:

  • 常量池中有一个对象:"hello"

  • 堆中又创建了一个新的 String 实例,内容一样,但不是同一个引用

✅ 总结:

位置

对象

是否新建

常量池

"hello"

✅ 如果之前没有就新建

堆内存

new String

✅ 始终新建

🔸 共创建 2 个对象(常量池 1 个 + 堆中 1 个)


✅ String str = "abc" 创建了几个对象?

✅ 答案:最多创建 1 个对象

🔍 分析过程:

String str = "abc";

  • "abc" 是一个编译期可确定的字面量,会被放入 .class 文件的常量池中;

  • 类加载时 JVM 会把它加载到运行时的字符串常量池中;

  • 变量 str 直接指向这个池中的字符串对象;

  • 如果常量池中已经存在 "abc",则不会重复创建。

✅ 总结:

位置

对象

是否新建

常量池

"abc"

✅ 第一次出现时创建

堆内存

❌ 不走 new 不创建堆对象

🔸 只会创建 1 个对象(且只在第一次使用时创建)


🧠 对比总结

表达式

常量池对象

堆对象

总共几个

String str = "abc";

✅ 1 个

❌ 0 个

✅ 1 个

String str = new String("abc");

✅ 1 个

✅ 1 个

✅ 2 个

String str = new String("abc").intern();

✅ 1 个(池中)

✅ 1 个(被丢弃)

✅ 2 个创建,但使用 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
    }
}

0

评论区