当前位置: 首页 > 面试题库 >

面试问题:符合垃圾收集条件的对象

濮阳祯
2023-03-14
问题内容

输入以下代码:

class A {
    Boolean b;
    A easyMethod(A a){
        a = null;
        return a;
    }
    public static void main(String [] args){
        A a1 = new A();
        A a2 = new A();
        A a3 = new A();
        a3 = a1.easyMethod(a2);
        a1 = null;
        // Some other code 
    }
}

问题是,之前有多少对象可以进行垃圾回收// Some other code

那么正确的答案是(至少那是面试官的答案): 2- 布尔值,b因为它是包装器和a1

您能请我解释一下为什么a2并且a3没有被垃圾收集吗?

稍后编辑:

  • 好吧,我想我明白了。起初有点令人困惑,但现在我确信面试官是错的。我最初的错误是,起初我不认为Java仅通过值传递,因此不可能从以“ a2”为参数的函数内部使a2为null,因为a2实际上是a2的副本。
  • 布尔值b的部分确实非常明显。

感谢您的答复,之后,我将发送一些采访反馈:)。


问题答案:

假设go应该是easyMethod这样的

class A {
    Boolean b;
    A easyMethod(A a){
        a = null; // the reference to a2 was passed in, but is set to null
                  // a2 is not set to null - this copy of a reference is!
        return a; // null is returned
    }
    public static void main(String [] args){
        A a1 = new A(); // 1 obj
        A a2 = new A(); // 2 obj
        A a3 = new A(); // 3 obj
        a3 = a1.go(a2); // a3 set to null and flagged for GC - see above for why
        a1 = null; // so far, a1 and a3 have been set to null and flagged
        // Some other code 
    }
}

有两个对象可以进行垃圾回收(a1和a3)。b不是因为它只是对null的引用。没有Boolean什么时候进行。

为了避免// Some other code可能出现的无聊的微妙之处,我提出将问题改写为以下内容:

预测并解释以下输出:

class A {
    int i;
    A(int i) { this.i = i; }
    public String toString() { return ""+i; }
    A go(A a){
        a = null; // the reference to a2 was passed in, but is set to null
                  // a2 is not set to null - this copy of a reference is!
        return a; // null is returned
    }
    public static void main(String [] args){
        A a1 = new A(1); // 1 obj
        A a2 = new A(2); // 2 obj
        A a3 = new A(3); // 3 obj
        a3 = a1.go(a2); // a3 set to null and flagged for GC - see above for why
        a1 = null; // so far, a1 and a3 have been set to null and flagged

        test(a1);
        test(a2);
        test(a3);

    }
    static void test(A a) {
        try { System.out.println(a); } 
        catch(Exception e) { System.out.println((String)null); }
    }
}

并输出:

c:\files\j>javac A.java

c:\files\j>java A
null
2
null

后续工作是,此时a1和a3符合GC资格,而a2不符合GC资格。

这个问题的教训是“将对象引用传递给方法并将该引用设置为null不会导致原始引用为空”。那就是面试官试图测试的知识。



 类似资料:
  • 问题内容: 这个问题来自Kathy Sierra SCJP 1.6 。有多少对象可以进行垃圾收集? 根据Kathy Sierra的回答,它是。这意味着两个对象可以进行垃圾回收。我已经给出了答案的解释。 但是,为什么不符合垃圾收集(GC)的条件? 何时到达,有多少对象可以使用GC? 答:0 B:1 C:2 D:编译失败 E:不可能知道 F:在运行时引发异常 回答: C是正确的。仅一个CardBoar

  • 这个问题取自凯西·塞拉SCJP 1.6。有多少对象符合垃圾收集的条件? 根据凯西·塞拉的回答,它是。这意味着有两个对象可以进行垃圾收集。我已经解释了答案。但是为什么不符合垃圾收集(GC)的条件呢? 当到达时,有多少对象符合GC条件? A:0 答复: C是正确的。只有一个硬纸板对象(c1)符合条件,但它有一个关联的wrapper对象也符合条件

  • 当Tester类的主方法结束时,有多少对象符合垃圾收集的条件?我的印象是答案是两个,尤其是a1,b1。然而,我找到了一个正确的答案,那就是只有一个对象是合格的。我认为,由于我们没有将b1指定为a2中的成员变量,b1在主要结束之前被分配为null,所以应该由垃圾收集器收集。什么是真的?

  • 给定以下代码,在main()中创建了多少对象,在执行第15行之后,有多少对象符合垃圾回收机制? 3个已创建,0个符合条件 4个已创建,1个符合条件 5个创建,2个符合条件 3个已创建,2个符合条件 以上都不是 好的,首先,请不要把它标记为家庭作业。这是我大学的一个测试题。根据我的说法,应该有两个创建的对象,第15行之后有一个符合垃圾收集的条件。这是因为只有两个新的操作符用于创建对象,而“d”在开始

  • 有人能给我解释一下原因吗?

  • 鉴于: 当到达第11行时,有多少对象符合垃圾收集条件?