Java for(Something s:Something.getList())
我有个简短的问题 我这样使用子句是否重要:Java for(Something s:Something.getList()),java,loops,for-loop,Java,Loops,For Loop,我有个简短的问题 我这样使用子句是否重要: for(Object obj : something.b.c.d.getList(){ ... } 还是这个 List list = something.b.c.d.getList(); for(Object obj : list){ ... } 我想知道其中一个是否比另一个快主要区别在于风格。语义基本相同。唯一显著的语义差异是,在第二个示例中,列表引用被命名,并且可以在循环内部和之后访问: List list = something.b.c.d.
for(Object obj : something.b.c.d.getList(){
...
}
还是这个
List list = something.b.c.d.getList();
for(Object obj : list){
...
}
我想知道其中一个是否比另一个快主要区别在于风格。语义基本相同。唯一显著的语义差异是,在第二个示例中,列表引用被命名,并且可以在循环内部和之后访问:
List list = something.b.c.d.getList();
for(Object obj : list){
if (list.contains(...)) { // inefficient, used purely as an illustration
...
}
}
int n = list.size();
在第一个示例中,如果不再次评估something.b.c.d.getList()
,则无法实现上述功能
如果您担心第一个示例反复计算
something.b.c.d.getList()
,那么情况肯定不是这样。您的两个示例都只对表达式求值一次。性能可能没有差异,但总体性能取决于访问这些字段的成本(即从框架延迟加载)。访问字段只会发生一次,无论您选择用于此循环的样式如何
如果这两项都可以在增强型for语句中使用,那么这两种方法都是可以接受的
除非剖析器将代码的这一特定区域指定为故障点,否则我不会关心这样的优化。我不同意这种说法。这些字段肯定只被访问一次?你可能是对的。我可能读得有点太快了。让我重新表述一下,我没有证据证明这一点,但对我来说,这只是一个同步过程,两种方法编译成相同的代码,即:
Iterator it=list.Iterator();而(it.hasNext()){…}
@Dici:没错。我不得不重新阅读JLS以进行复习,但是的,它们基本上变成了相同的表达方式。@JonSkeet:这意味着什么?从我最初的陈述开始,我重新编写了我的问题。看起来您关心的是性能微观优化,但这样的代码表明您确实应该关心设计和类型安全:它使用原始列表而不是泛型列表,使用公共字段而不是访问器。