这个怎么做? 2024-10-20 09:28 采纳率: 53%
浏览 3
已结题

Java_String的问题


String ab = new String("ca");
ab = "ca";
String bc = "ca";
System.out.println(ab == bc);

当我们在这样做的时候,第一行,ab new出来的堆中的空间是被当作垃圾销毁了吗

  • 写回答

1条回答 默认 最新

  • 无疆76 2024-10-20 09:29
    关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    是的,你的理解是正确的。当你执行 String ab = new String("ca"); 这行代码时,你创建了一个新的 String 对象并赋值给 ab。这个对象存储在Java的堆内存中。然而,当你执行下一行 ab = "ca"; 时,你实际上改变了 ab 指向的对象。原来的 String 对象(即之前通过 new String("ca") 创建的那个对象)不再被引用,因此它成为了垃圾回收的候选对象。

    Java的垃圾回收机制会自动检测这些不再被引用的对象,并在适当的时机释放它们的内存。因此,通过 new String("ca") 创建的原始 String 对象在不再被引用后,其占用的内存会被垃圾回收。

    最后,当你执行 System.out.println(ab == bc); 时,因为 abbc 都指向了字符串常量 "ca",所以输出应该是 true。这是因为字符串常量池(String Pool)中已经有了一个 "ca" 的实例,当你再次使用字面量创建 "ca" 时(如 bc = "ca";),Java会寻找池中是否已有该字符串的实例,如果有则不会创建新的实例,而是使其指向已存在的实例。所以 abbc 指向的是同一个实例。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 10月28日
  • 已采纳回答 10月20日
  • 创建了问题 10月20日