Java: 变量声明在循环体内还是循环体外的争论
2017-10-06 21:54
399 查看
下面两段代码本质上是一样的,首先看看for循环内局部变量的生命周期。
(1)
在第i次循环,初始化变量obj引用了一个生成对象O1;但当此次循环结束时,变量obj被回收,所以对象O1可以被GC回收了;
在第i+1次循环,初始化新变量obj(跟第i次循环的obj没有任何关系)引用了一个生成对象O2;但当此次循环结束时,变量obj被回收,所以对象O2可以被GC回收了;
(2)
在第i次循环,变量obj引用了一个生成对象O1;但当此次循环结束时,对象O1不可以被GC回收;
在第i+1次循环,变量obj引用了一个生成对象O2,此时生成对象O1没有引用,所以对象O1可以被GC回收;但当此次循环结束时,对象O2不可以被GC回收;
注意,最后一个生成的对象即使在所有循环都结束后,会一直被obj引用;若要回收则需要再次令obj=null。
知乎上有人用字节码说话的
注意:C++中没有GC机制,一定要delete,而且要记好指针的值,不然只能等程序结束后,new出来的对象 才能被回收。
(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中循环声明变量方法
- java中向上转型时变量类型由声明时决定还是由new决定的理解
- Java变量没声明是公有还是私有
- Java中循环声明变量方法
- 变量定义在循环体内还是循环外?
- 变量声明到底在循环外部好还是在循环内部好?
- 关于变量在循环内声明还是在循环外声明
- Java的变量声明_条件结构_循环
- Java变量没声明是公有还是私有
- 边打dota边学java 第二篇(java中变量类型及变量声明格式)
- Java变量声明与赋值习惯
- Java变量之间传值- 值传递还是引用传递的讨论
- Java的垃圾回收机制,GC,和变量的创建和删除的关系(即变量的作用域,for循环中的某个变量,出了for循环再引用就会报错了,因为该变量已经被从内存中删掉了)
- java基础笔试题(一)--取二进制位,变量互换,for循环标记
- Java中声明变量的八进制与十六进制
- java环境变量path也配置了,但还是显示javac不是内部或外部命令的解决办法
- C/C++中声明指针变量时星号是靠近变量名还是靠近类型?
- Java一行代码可声明多个同类变量
- Java的声明变量格式、Java局部变量、实例变量、类变量