gpt4 book ai didi

java - Java是按值传递吗?垃圾收集相关

转载 作者:行者123 更新时间:2023-12-01 20:07:39 24 4
gpt4 key购买 nike

我有一个问题让我很困惑,

运行以下代码的第 8 行后,哪些对象符合垃圾回收条件?

public class X 
{
public static void main(String [] args)
{
X x = new X();
X x2 = m1(x); /* Line 6 */
X x4 = new X();
x2 = x4; /* Line 8 */
doComplexStuff();
}
static X m1(X mx)
{
mx = new X();
return mx;
}
}

A.x
B.x 和 x2
C.x 和 x4
D.x4

我最初的想法是只有 x2 被垃圾收集,因为当 x2 = x4 时它在第 8 行被推迟,并且由于 java 是按值传递的,所以 X x2 = m1(x) 不会影响 x。

我在这里也发现了完全相同的问题(但选择不同)https://www.indiabix.com/java-programming/garbage-collections/discussion-202 ,还有一些评论说 x 也应该被垃圾收集,这与我的想法相矛盾,现在我很困惑这个问题的哪个选择是正确的,提前感谢。

最佳答案

正如许多人所回答的那样,x2 引用的对象已被垃圾收集。下面是一个示例代码,可让您自己检查 GC,该代码还演示了 Java 的行为:

Java 通过引用操作对象,但它通过值将对象引用传递给方法。

public class GCInJava 
{
int i=0;
String name="default";
@Override
protected void finalize() throws Throwable {
super.finalize();
System.out.println("[GCing object referenced by: "+this.name+"]");
}
public static void main(String [] args)
{
GCInJava x = new GCInJava();
x.name="x";
System.out.println("x before calling m1(): "+x);
System.out.println("x.i before calling m1(): "+x.i);
GCInJava x2 = m1(x);
System.out.println("x.i after calling m1(): "+x.i);
System.out.println("x after calling m1(): "+x);
System.out.println("x2.i: "+x2.i);
GCInJava x4 = new GCInJava();
x4.name="x4";
x2 = x4;
System.gc();
doComplexStuff();
}
static GCInJava m1(GCInJava mx)
{
System.out.println("mx before new object: "+mx);
mx = new GCInJava();
mx.i=10;
mx.name="mx/x2";
System.out.println("mx after new object: "+mx);
return mx;
}
}

注意: System.gc() 可能并不总是触发 JVM 的垃圾回收;因此请尝试运行代码几次。

示例输出(注意打印的哈希代码):

x before calling m1(): tests.GCInJava@64c3c749
x.i before calling m1(): 0
mx before new object: tests.GCInJava@64c3c749
mx after new object: tests.GCInJava@7150bd4d
x.i after calling m1(): 0
x after calling m1(): tests.GCInJava@64c3c749
x2.i: 10

[GCing object referenced by:mx/x2]

关于java - Java是按值传递吗?垃圾收集相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47195138/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com