所以我最近去过面试,并被问到以下问题。 (实际上这只是一个测试写作,所以我不能问任何问题)
在main方法结束时,有多少对象可以进行垃圾回收?
function removeNoise(str) {
var base = "%$&/#·@|º\ª";
var arr = str.split('');
for(var i = arr.length - 1; i <= 0 ; i--) {
var item = arr[i];
if(base.indexOf(item) >= 0) {
//remove the offending character
arr.splice(i,1);
}
}
return arr.join('');
}
removeNoise('he%$&/#·@|º\ª\llo'); //=> $/·|ªllo
(A)0
(B)1
(C)5
我知道它是0,因为至少有一个对象(public class Main {
public static void main(String[] args) {
Object obj;
for (int i = 0; i < 5; i++) {
obj = new Object();
}
obj = null;
}
}
)将被垃圾收集,但我也知道obj
不是真正的对象,它只是对它的引用。所以我的回答是5.
这是对的吗?如果没有,那么为什么?
答案 0 :(得分:6)
您的回答5 is correct
。
这里通过for循环创建了总共5个对象,所有这些对象都可以在方法结束时进行垃圾回收。
答案 1 :(得分:4)
可能 0 ,
编译器可能会进行一些优化并消除整个循环,并避免首先创建在循环中创建的五个对象。
因此,如果没有进行编译器优化,则在循环内创建5个对象,并且在变量obj
中覆盖它们的引用,在末尾变量将引用分配给{{的最后一个对象。 1}}。