一个循环内初始化

问题描述:

回到基本问题一个循环内初始化

哪个“而”之一下面环路是高效的内存明智

 SomeObject someObject; 
    while (iterator.hasNext()) { 
     someObject = iterator.next(); 
    } 

OR

while (iterator.hasNext()) { 
    SomeObject someObject = iterator.next(); 
} 
+2

编译器*最有可能*为您优化循环。 – TheLostMind

+0

TheLostMind是对的,它们可能具有相同的效果 – Shail016

+0

不要浪费时间去思考这些事情,除非你正在观察某种问题。 Java非常适合快速分配和取消分配对象和引用。 – Keppil

首届将更有效率在Java中,每当循环运行时都不会创建新的对象。这意味着垃圾收集必须经常运行以删除旧对象。作为一般规则(即使在非垃圾收集语言中),重用旧对象比删除旧对象更有效,并且创建新对象更有效

+1

在此代码中不会创建任何对象。 –

+0

这是不正确的。 – Maroun

+1

这是个可怕的建议。始终选择微观优化的可读性。 – Keppil

两者实际上是相同的。这里创建的唯一东西就是参考。创建一次或多次它不会对内存或执行速度产生任何实际影响。

从设计和(GC)的角度来看:假设您正在迭代的Collection在while循环后得到GCed。

SomeObject someObject; //你仍然会有while循环

while (iterator.hasNext()) { 
    someObject = iterator.next(); 
} 

//对象被someObject引用将不准备GC这里外到最后SomeObject的参考。因为它仍然有一个参考。

OR

while (iterator.hasNext()) { 
    SomeObject someObject = iterator.next(); 
} 
// someObject will make no impact on the GC of the object is points to. 
+0

查看代码可能无关紧要,集合的范围只能等于或大于SomeObject的范围,所以集合被GCed SomeObject不能发生之前。 –

+0

@VivekVK - 如果我传递/返回变量'someObject'到另一个方法,并且如果集合是用这个方法创建的...?。这将直接影响集合中最后一个对象的GCing? – TheLostMind

+0

你没有想到这一点。抱歉。 –

两个代码段正在除了东西,在第一种情况下,你可以使用对象引用someobject即使在while块已经完成了它的迭代没有什么区别。

+0

是的,你可以。但那只会指向迭代器中的最后一个对象,所以我不认为它完全是“使用”,除非你特别需要最后一个通常不常见的对象。 –

+0

@VivekVK与你完全同意,除了最后一个字'不常见' – nobalG

+0

可能是我的看法。 –