2012-12-13 15 views
5

W moim kodu,Korzystanie for-each pętli w java

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

Korzystanie country.getCities() jest kosztowne? Czy JVM utrzyma stacktrace dla każdego połączenia ..?

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

Jaki jest najlepszy sposób użycia?

Odpowiedz

9

Nie, to pętla:

for(City city : country.getCities()) 

tylko zadzwonić country.getCities()raz, a następnie iteracyjne nad nim. Nie wywołuje go dla każdej iteracji pętli. W twoim przypadku jest to odpowiednik:

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

Nie ma żadnej korzyści z przepisywania go zgodnie z twoim drugim fragmentem.

Aby uzyskać więcej informacji, patrz section 14.14.2 of the JLS.

+0

Jest jedna korzyść, napisanie długiej wersji z jawnym iteratorem umożliwia wykonanie iterator.remove(), którego nie można wykonać za pomocą krótkiej wersji – portforwardpodcast

+0

@portforwardpodcast: Oczywiście, ale to tak, jakby powiedzieć, że lepiej jest użyć 'for 'loop i' get', ponieważ masz indeks. W kontekście kodu faktycznie podanego tutaj nie ma żadnej korzyści. –

3

W obu przypadkach getCities() jest wywoływane tylko raz.

Domyślne wyłączenie odpowiedzialności: Jak zwykle prawie nigdy nie musisz martwić się o wydajność, ponieważ kompilator jest o wiele lepszy niż osoba.

1

Są to równoważne. getCities() zostanie wykonane tylko raz. (jeśli umieścisz w tej metodzie wartość System.out.println(), powinieneś to zobaczyć).

pamiętać, że nie zadzwoni getCities() wielokrotnie nie tylko ze względu na wydajność, ale także dlatego, że nie ma ma gwarancji, że będzie powrotu tej samej kolekcji każdorazowo (może to być intuicyjne, że zwraca tej samej kolekcji, ale nie jest to obowiązkowe)

Wolałbym twój pierwszy przykład za zwięzłość.

0

Obie są takie same, nie ma różnicy. I country.getCities() zostanie wywołany raz w pętli.

Najpierw myślę lepiej, ponieważ nie ma żadnego dodatkowego odniesienia.

0

JVM zoptymalizuje kod, gdy zostanie skompilowany w celu zapewnienia, że ​​metoda country.getCities() zostanie wywołana jednokrotnie.

Powinieneś napisać swój kod w taki sposób, jak Ty i/lub Twój zespół wydaje się być najbardziej czytelny.