Mayoritas perulangan kita memiliki satu tujuan sederhana: menjelajahi seluruh elemen sebuah array atau daftar, satu per satu dari awal hingga akhir. Loop for berindeks bekerja untuk kasus itu, tetapi membawa beban yang tidak diperlukan — variabel i, kondisi i < panjang, dan risiko salah batas (off-by-one) setiap kali ditulis. Sejak Java 5, bahasa ini menyediakan enhanced for loop (disebut juga for-each) yang mengambil satu elemen pada setiap putaran tanpa menunjukkan indeks sama sekali. Chapter ini membahas mekanismenya, batasannya — kapan indeks tetap wajib dipegang — serta satu larangan penting soal mengubah isi collection selama iterasi berjalan.

Bentuk dan Mekanisme #

Bentuk enhanced for mendeklarasikan variabel per-elemen, titik dua, lalu array atau collection yang dijelajahi:

java Bentuk umum enhanced for
for (Tipe nama : kumpulan) {
    // nama menerima satu elemen pada tiap putaran
}

Contoh berikut merangkum keranjang belanja — mencetak seluruh nama barang dan menjumlahkan seluruh harga tanpa satu pun indeks:

import java.util.Arrays;

public class RingkasanKeranjang {
    public static void main(String[] args) {
        String[] namaBarang = {"Beras 5 kg", "Minyak goreng", "Gula 1 kg"};
        int[] daftarHarga = {68000, 32000, 15000};

        int total = 0;
        for (int harga : daftarHarga) {
            total += harga;
        }

        System.out.println("Daftar belanja Budi:");
        for (String barang : namaBarang) {
            System.out.println(" - " + barang);
        }

        System.out.println("Harga per barang: " + Arrays.toString(daftarHarga));
        System.out.println("Total belanja   : Rp" + total);
    }
}

Output yang Dihasilkan:

text
Daftar belanja Budi:
 - Beras 5 kg
 - Minyak goreng
 - Gula 1 kg
Harga per barang: [68000, 32000, 15000]
Total belanja   : Rp115000

Mari kita bedah cara kerjanya:

  1. Baris 9-11 (for (int harga : daftarHarga)): pada tiap putaran, variabel harga menerima isi elemen berikutnya dari daftarHarga — dimulai dari elemen pertama 68000, berakhir di elemen terakhir 15000 — tanpa kita menulis i sama sekali.
  2. Baris 10 (total += harga;): akumulator dari chapter sebelumnya bekerja persis sama; yang berubah hanya cara mengambil elemen.
  3. Di balik layar: untuk array, compiler javac menerjemahkan loop ini menjadi perulangan indeks biasa; untuk collection seperti ArrayList, iterasi dijalankan lewat objek Iterator milik collection tersebut. Kita menulis satu bentuk, dua mesin berbeda menanganinya.
  4. Baris 18 (Arrays.toString(daftarHarga)): method utilitas java.util.Arrays mencetak isi array secara utuh — cara cepat memeriksa isi array tanpa loop manual.

Kapan Indeks Masih Diperlukan #

Enhanced for menyembunyikan indeks, dan menyembunyikan pula alamat elemen: variabel per-elemen menerima salinan nilai, bukan pintu menuju elemen aslinya. Mengisi ulang variabel tersebut tidak mengubah array sumbernya:

java UbahElemen.java
import java.util.Arrays;

public class UbahElemen {
    public static void main(String[] args) {
        int[] data = {1, 2, 3, 4, 5};

        // Variabel nilai hanya menerima SALINAN isi elemen;
        // mengubahnya tidak menyentuh array asli.
        for (int nilai : data) {
            nilai = nilai * 10;
        }
        System.out.println("Setelah enhanced for : " + Arrays.toString(data));

        // Perubahan isi array membutuhkan indeks
        for (int i = 0; i < data.length; i++) {
            data[i] = data[i] * 10;
        }
        System.out.println("Setelah for indeks  : " + Arrays.toString(data));
    }
}

Output yang Dihasilkan:

text
Setelah enhanced for : [1, 2, 3, 4, 5]
Setelah for indeks  : [10, 20, 30, 40, 50]

Loop pertama berjalan lima kali, variabel nilai lima kali ditulis 10, 20, 30, ... — namun array tetap [1, 2, 3, 4, 5], karena nilai = nilai * 10 hanya mengubah salinan lokal per iterasi. Loop kedua memakai indeks dan menulis langsung ke data[i], sehingga array sungguhan berubah menjadi [10, 20, 30, 40, 50]. Panduan memilih bentuknya ringkas:

KebutuhanBentuk yang tepat
Membaca semua elemen berurutanEnhanced for
Mengubah isi elemen arrayfor dengan indeks
Butuh posisi elemen (mis. mencetak nomor urut)for dengan indeks
Menjelajah sebagian saja atau mundurfor dengan indeks

Iterasi Collection dan Larangan Penghapusan #

Enhanced for juga menerima collection seperti ArrayList — daftar fleksibel yang ukurannya dapat bertambah dan berkurang saat program berjalan (kita bahas tuntas pada Section Collections Framework). Terdapat satu aturan keras: jangan menambah atau menghapus elemen collection dari dalam enhanced for yang sedang mengiterasinya:

java DaftarTugas.java
import java.util.ArrayList;
import java.util.List;

public class DaftarTugas {
    public static void main(String[] args) {
        List<String> tugas = new ArrayList<>();
        tugas.add("Mencuci piring");
        tugas.add("Menyapu halaman");
        tugas.add("Belajar Java");

        System.out.println("Daftar tugas Siti:");
        for (String satu : tugas) {
            System.out.println(" - " + satu);
        }

        // Menghapus elemen dari dalam enhanced for memicu
        // ConcurrentModificationException pada iterasi berikutnya.
        try {
            for (String satu : tugas) {
                if (satu.equals("Mencuci piring")) {
                    tugas.remove(satu);
                }
            }
        } catch (java.util.ConcurrentModificationException e) {
            System.out.println("Iterasi dihentikan: ConcurrentModificationException");
        }
        System.out.println("Isi daftar sekarang : " + tugas);
        System.out.println("Jumlah tugas tersisa: " + tugas.size());
    }
}

Output yang Dihasilkan:

text
Daftar tugas Siti:
 - Mencuci piring
 - Menyapu halaman
 - Belajar Java
Iterasi dihentikan: ConcurrentModificationException
Isi daftar sekarang : [Menyapu halaman, Belajar Java]
Jumlah tugas tersisa: 2

Perhatikan dua fakta yang tampak pada keluarannya: pemanggilan tugas.remove(satu) sendiri berhasil (daftar menyusut menjadi dua tugas), namun Iterator yang menjalankan loop mendeteksi perubahan struktur itu dan melemparkan ConcurrentModificationException begitu iterasi berikutnya diminta. Iterasi berhenti di tengah jalan — pada program tanpa try-catch, exception ini menghentikan seluruh program.

Enhanced for menuntaskan kebutuhan iterasi paling umum dengan sintaks paling ringkas. Namun tidak semua perulangan tahu di mana berhenti — banyak loop justru berjalan “selama masih ada data yang masuk” atau “selama hasil belum memadai”. Untuk pola itu Java menyediakan while, topik chapter berikutnya.

Referensi #

Berkas Sumber

Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.

DaftarTugas.java

Unduh berkas
java
import java.util.ArrayList;
import java.util.List;

public class DaftarTugas {
    public static void main(String[] args) {
        List<String> tugas = new ArrayList<>();
        tugas.add("Mencuci piring");
        tugas.add("Menyapu halaman");
        tugas.add("Belajar Java");

        System.out.println("Daftar tugas Siti:");
        for (String satu : tugas) {
            System.out.println(" - " + satu);
        }

        // Menghapus elemen dari dalam enhanced for memicu
        // ConcurrentModificationException pada iterasi berikutnya.
        try {
            for (String satu : tugas) {
                if (satu.equals("Mencuci piring")) {
                    tugas.remove(satu);
                }
            }
        } catch (java.util.ConcurrentModificationException e) {
            System.out.println("Iterasi dihentikan: ConcurrentModificationException");
        }
        System.out.println("Isi daftar sekarang : " + tugas);
        System.out.println("Jumlah tugas tersisa: " + tugas.size());
    }
}

RingkasanKeranjang.java

Unduh berkas
java
import java.util.Arrays;

public class RingkasanKeranjang {
    public static void main(String[] args) {
        String[] namaBarang = {"Beras 5 kg", "Minyak goreng", "Gula 1 kg"};
        int[] daftarHarga = {68000, 32000, 15000};

        int total = 0;
        for (int harga : daftarHarga) {
            total += harga;
        }

        System.out.println("Daftar belanja Budi:");
        for (String barang : namaBarang) {
            System.out.println(" - " + barang);
        }

        System.out.println("Harga per barang: " + Arrays.toString(daftarHarga));
        System.out.println("Total belanja   : Rp" + total);
    }
}

UbahElemen.java

Unduh berkas
java
import java.util.Arrays;

public class UbahElemen {
    public static void main(String[] args) {
        int[] data = {1, 2, 3, 4, 5};

        // Variabel nilai hanya menerima SALINAN isi elemen;
        // mengubahnya tidak menyentuh array asli.
        for (int nilai : data) {
            nilai = nilai * 10;
        }
        System.out.println("Setelah enhanced for : " + Arrays.toString(data));

        // Perubahan isi array membutuhkan indeks
        for (int i = 0; i < data.length; i++) {
            data[i] = data[i] * 10;
        }
        System.out.println("Setelah for indeks  : " + Arrays.toString(data));
    }
}