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:
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:
Daftar belanja Budi:
- Beras 5 kg
- Minyak goreng
- Gula 1 kg
Harga per barang: [68000, 32000, 15000]
Total belanja : Rp115000Mari kita bedah cara kerjanya:
- Baris 9-11 (
for (int harga : daftarHarga)): pada tiap putaran, variabelhargamenerima isi elemen berikutnya daridaftarHarga— dimulai dari elemen pertama68000, berakhir di elemen terakhir15000— tanpa kita menulisisama sekali. - Baris 10 (
total += harga;): akumulator dari chapter sebelumnya bekerja persis sama; yang berubah hanya cara mengambil elemen. - Di balik layar: untuk array, compiler
javacmenerjemahkan loop ini menjadi perulangan indeks biasa; untuk collection sepertiArrayList, iterasi dijalankan lewat objekIteratormilik collection tersebut. Kita menulis satu bentuk, dua mesin berbeda menanganinya. - Baris 18 (
Arrays.toString(daftarHarga)): method utilitasjava.util.Arraysmencetak 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:
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:
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:
| Kebutuhan | Bentuk yang tepat |
|---|---|
| Membaca semua elemen berurutan | Enhanced for |
| Mengubah isi elemen array | for dengan indeks |
| Butuh posisi elemen (mis. mencetak nomor urut) | for dengan indeks |
| Menjelajah sebagian saja atau mundur | for 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:
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:
Daftar tugas Siti:
- Mencuci piring
- Menyapu halaman
- Belajar Java
Iterasi dihentikan: ConcurrentModificationException
Isi daftar sekarang : [Menyapu halaman, Belajar Java]
Jumlah tugas tersisa: 2Perhatikan 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 #
- JLS SE25 §14.14.2: The enhanced for Statement
- Oracle Tutorial: The for Statement
- Java SE25 API: java.util.Iterator
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
DaftarTugas.java
Unduh berkasimport 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 berkasimport 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 berkasimport 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));
}
}