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

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

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

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

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

阅读 8k
8 个回答

这两种写法只是变量声明方法不同,对象创建的次数一样的(看new的调用次数)。

第一种声明方法的变量,只在循环体内能够使用,可以避免其他地方的误用,建议使用。

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

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

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

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

第一种能够保证对象的整个生命周期在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.

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题