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

今天遇到一个关于for循环内对象的写法问题

一种是:
for (condition){
    Object obj = new Object();
    //handle obj
}

第二种是
Object obj = null;
for (condition){
    obj = new Object();
    //handle obj
}

我想了解一下这两种的写法的一个区别
工作中经常见到的是第一种的写法。
个人见解是第一种创建了更多的对象,第二种只是引用的对象变了。觉得第二种写法更好。
但公司那么多比我经验丰富的都写第一种。我想知道的是这两种写法的区别是否可以忽略不计?没有什么影响

慕妹3146593
浏览 841回答 8
8回答

开满天机

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

PIPIONE

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

小唯快跑啊

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

阿晨1998

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

慕容森

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

猛跑小猪

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

Helenr

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

相关分类

Java