您的位置:首页 > 编程语言 > Java开发

Java: 变量声明在循环体内还是循环体外的争论

2017-10-06 21:54 399 查看
下面两段代码本质上是一样的,首先看看for循环内局部变量的生命周期

(1)

在第i次循环,初始化变量obj引用了一个生成对象O1;但当此次循环结束时,变量obj被回收,所以对象O1可以被GC回收了;

在第i+1次循环,初始化新变量obj(跟第i次循环的obj没有任何关系)引用了一个生成对象O2;但当此次循环结束时,变量obj被回收,所以对象O2可以被GC回收了;

for (int i = 0; i < 10000; ++i) {
Object obj = new Object();
System.out.println("obj= "+ obj);
}


(2)

在第i次循环,变量obj引用了一个生成对象O1;但当此次循环结束时,对象O1不可以被GC回收;

在第i+1次循环,变量obj引用了一个生成对象O2,此时生成对象O1没有引用,所以对象O1可以被GC回收;但当此次循环结束时,对象O2不可以被GC回收;

注意,最后一个生成的对象即使在所有循环都结束后,会一直被obj引用;若要回收则需要再次令obj=null。

Object obj = null;

for (int i = 0; i < 10000; ++i) {
obj = new Object();
System.out.println("obj= "+ obj);
}


知乎上有人用字节码说话的

注意:C++中没有GC机制,一定要delete,而且要记好指针的值,不然只能等程序结束后,new出来的对象 才能被回收。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 2017