for(Something s : something.getList())

3

我有一个简短的问题:这样使用从句有什么影响吗:

for(Object obj : something.b.c.d.getList(){
...
}

或者这个

List list = something.b.c.d.getList();
for(Object obj : list){
...
}

我在想其中一个是否比另一个更快。

1
看来你关注性能微观优化,但是这段代码表明你应该更关注设计和类型安全性:它使用原始列表而不是通用列表,并且使用公共字段而不是访问器。 - JB Nizet
2个回答

3

主要区别在于风格。语义基本相同。唯一显著的语义差异在于,在第二个示例中,列表引用被命名,并且可以在循环内部和之后访问:

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(),那是不必要的。你的两个示例都只评估表达式一次。


1

性能上可能没有区别,但整体性能取决于访问这些字段的成本(即从框架中进行延迟加载)。无论您选择为此循环使用哪种样式,访问字段只会发生一次。

如果两个项目都可以在增强的for语句中使用,则两种方法都是可接受的。

除非分析器将代码中的特定区域指定为问题点,否则不必担心此类优化。


我不理解这个论点。难道这些字段只被访问一次吗? - NPE
1
我没有证据来证明它,但对我来说这只是语法糖,两种方法都编译成相同的代码,即:Iterator<Object> it = list.iterator(); while (it.hasNext()) { ... } - Dici
@Dici:没错。我不得不重新阅读JLS来进行复习,但是是的,它们基本上变成了相同的表达式。 - Makoto
1
@JonSkeet:它怎么暗示呢?自从我最初的陈述以来,我已经重新措辞了我的问题。 - Makoto
我可以重新表述一下,让它看起来不那么像是这样的情况。 - Makoto
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接