5

在我的代码中,

for(City city : country.getCities()){
   // do some operations
}

使用 country.getCities() 成本高吗?JVM 会为每次调用维护堆栈跟踪吗?

List<City> cityList = country.getCities();
for(City city : cityList){
   // do some operations
}

最好的使用方法是什么?

4

5 回答 5

9

不,这个循环:

for(City city : country.getCities())

只会调用country.getCities() 一次,然后对其进行迭代。它不会为循环的每次迭代调用它。在您的情况下,它相当于:

for (Iterator<City> iterator = country.getCities().iterator();
     iterator.hasNext(); ) {
    City city = iterator.next();
    // do some operations
}

根据您的第二个片段重写它没有任何好处。

有关详细信息,请参阅JLS 的第 14.14.2 节

于 2012-12-13T10:33:42.333 回答
3

在这两种情况下,getCities()都只调用一次。

默认免责声明:与往常一样,您几乎不需要担心性能,因为编译器在这方面比一个人要好得多。

于 2012-12-13T10:34:08.717 回答
1

这些是等价的。getCities()只会执行一次。(如果你坚持System.out.println()这种方法,你应该看到这个)。

请注意,它不会getCities()多次调用,不仅是出于性能原因,还因为不能保证每次都会返回相同的集合(它返回相同的集合可能很直观,但不是强制性的)

为了简洁起见,我更喜欢你的第一个例子。

于 2012-12-13T10:34:10.017 回答
0

两者都是一样的,没有区别。并将country.getCities()在循环中调用一次。

我认为第一个更好,因为没有使用额外的参考。

于 2012-12-13T10:34:33.763 回答
0

JVM 会在编译代码时对其进行优化,以确保country.getCities()方法被调用一次。

您应该以您和/或您的团队认为最易读的方式编写代码。

于 2012-12-13T10:34:44.157 回答