为了账号安全,请及时绑定邮箱和手机立即绑定

关于循环内创建对象的写法

关于循环内创建对象的写法

慕妹3146593 2019-03-01 10:32:46
今天遇到一个关于for循环内对象的写法问题 一种是: for (condition){ Object obj = new Object(); //handle obj } 第二种是 Object obj = null; for (condition){ obj = new Object(); //handle obj } 我想了解一下这两种的写法的一个区别工作中经常见到的是第一种的写法。个人见解是第一种创建了更多的对象,第二种只是引用的对象变了。觉得第二种写法更好。但公司那么多比我经验丰富的都写第一种。我想知道的是这两种写法的区别是否可以忽略不计?没有什么影响
查看完整描述

8 回答

?
开满天机

TA贡献1786条经验 获得超13个赞

对于java这样有块级作用域的语言,for循环中的obj对象在外面是无法使用的,能够很好地规避全局作用变量(不确定这个词是否表述正确)。

查看完整回答
反对 回复 2019-03-01
?
PIPIONE

TA贡献1829条经验 获得超9个赞

尽量使变量的可访问性最小化,这样可以避免误调用

查看完整回答
反对 回复 2019-03-01
?
小唯快跑啊

TA贡献1863条经验 获得超2个赞

这个编译器一般会优化的,有一种优化叫循环局部变量外提的优化。可以去看看。比如你的这种情况,编译器会把第一种情况优化为第二种,实际中很多人会倾向于使用第二种吧,但使用第一种也无可厚非。

这边有个讨论帖子可以看看。链接描述

查看完整回答
反对 回复 2019-03-01
?
阿晨1998

TA贡献2037条经验 获得超6个赞

第一种能够保证对象的整个生命周期在for循环内,规避了很多问题,比如for循环结束了,object就是可回收的了。也不会出现乱引用造成泄露的问题。
至于创建对象的个数,两种都一样多,都是在堆里面创建,只有当基本类型时,因为是在栈里面操作,存在常量池的概念,可以通过引用来使用对象

查看完整回答
反对 回复 2019-03-01
?
慕容森

TA贡献1853条经验 获得超18个赞

第一种更清晰,不容易出问题,实际效果上差别不大,可以忽略。
如果有下面这种情况,第二种写法就会有问题
Object obj = null;
Collection c ;
for (condition){

obj = new Object();
//handle obj
if(condition2){
    c.add(obj);
}

}

查看完整回答
反对 回复 2019-03-01
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

个人觉得第一种方式靠谱,第二种方式存在一定的问题:
因为竟然你需要在循环中创建一个对象,肯定是需要这个对象接收值,如果用第二种方式,那么在循环中,如果你将你new的对象放入一个list中,你就会发现,无论你循环多少次,这个list中长度永远只有一个,因为在循环中,你为这个对象赋值,只是值改变了,但是引用是不变的,那放入list中,那永远长度只会是1.

查看完整回答
反对 回复 2019-03-01
?
Helenr

TA贡献1780条经验 获得超4个赞

编译器会优化的,但是只从写法内容上来看,第二种写法对内存的占用会小一些.
这个要看你预估循环的次数,如果次数很少的话,没有什么区别.
如果循环次数比较多,第一种写法的obj变量就会在栈内存,同时指向在堆内存中new出的对象.
而第二种写法,obj变量只在栈内存中有一份,然后一直改变指向的堆内存对象.

查看完整回答
反对 回复 2019-03-01
  • 8 回答
  • 0 关注
  • 840 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号