String ab = new String("ca");
ab = "ca";
String bc = "ca";
System.out.println(ab == bc);
当我们在这样做的时候,第一行,ab new出来的堆中的空间是被当作垃圾销毁了吗
String ab = new String("ca");
ab = "ca";
String bc = "ca";
System.out.println(ab == bc);
当我们在这样做的时候,第一行,ab new出来的堆中的空间是被当作垃圾销毁了吗
以下回复参考:皆我百晓生、券券喵儿等免费微信小程序作答:
是的,你的理解是正确的。当你执行 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); 时,因为 ab 和 bc 都指向了字符串常量 "ca",所以输出应该是 true。这是因为字符串常量池(String Pool)中已经有了一个 "ca" 的实例,当你再次使用字面量创建 "ca" 时(如 bc = "ca";),Java会寻找池中是否已有该字符串的实例,如果有则不会创建新的实例,而是使其指向已存在的实例。所以 ab 和 bc 指向的是同一个实例。