Tüm değerleri okumak için koleksiyon üzerinde dolaşıyorsanız, yeni sözdizimi sadece sualtı yineleyiciyi kullandığından, yineleyici veya döngü sözdizimi için yeni kullanmak arasında bir fark yoktur.
Ancak, eski "c-style" döngüsünü kastediyorsanız:
for(int i=0; i<list.size(); i++) {
Object o = list.get(i);
}
Daha sonra, döngü veya yineleyici için yeni olan, temeldeki veri yapısına bağlı olarak çok daha verimli olabilir. Bunun sebebi, veri yapıları için, yani get(i)döngü, bir O (n yapan bir O (n) işlemi, bir 2 ) işlemi. Geleneksel bir bağlantılı liste böyle bir veri yapısına bir örnektir. Tüm yineleyicilerin, next()O (n) döngüsünü yapan bir O (1) işlemi olması gereken temel bir gereksinimi vardır .
Yineleyicinin yeni döngü sözdizimi tarafından su altında kullanıldığını doğrulamak için, aşağıdaki iki Java parçacığından oluşturulan bayt kodlarını karşılaştırın. İlk önce for döngüsü:
List<Integer> a = new ArrayList<Integer>();
for (Integer integer : a)
{
integer.toString();
}
// Byte code
ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 3
GOTO L2
L3
ALOAD 3
INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
CHECKCAST java/lang/Integer
ASTORE 2
ALOAD 2
INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;
POP
L2
ALOAD 3
INVOKEINTERFACE java/util/Iterator.hasNext()Z
IFNE L3
İkincisi, yineleyici:
List<Integer> a = new ArrayList<Integer>();
for (Iterator iterator = a.iterator(); iterator.hasNext();)
{
Integer integer = (Integer) iterator.next();
integer.toString();
}
// Bytecode:
ALOAD 1
INVOKEINTERFACE java/util/List.iterator()Ljava/util/Iterator;
ASTORE 2
GOTO L7
L8
ALOAD 2
INVOKEINTERFACE java/util/Iterator.next()Ljava/lang/Object;
CHECKCAST java/lang/Integer
ASTORE 3
ALOAD 3
INVOKEVIRTUAL java/lang/Integer.toString()Ljava/lang/String;
POP
L7
ALOAD 2
INVOKEINTERFACE java/util/Iterator.hasNext()Z
IFNE L8
Gördüğünüz gibi, oluşturulan bayt kodu etkili bir şekilde aynıdır, bu nedenle her iki formu da kullanmak için performans cezası yoktur. Bu nedenle, daha estetik olarak çekici olan döngü biçimini seçmelisiniz, çünkü her döngü için olacak çoğu insan için, daha az kazan plakası kodu vardır.