Bayangkan harus menyimpan nilai 40 mahasiswa. Membuat 40 variabel jelas tidak praktis. Pada pertemuan ini kita belajar array untuk menyimpan banyak data bertipe sama dalam satu variabel, array dua dimensi untuk data berbentuk tabel, serta ArrayList sebagai kumpulan data yang ukurannya fleksibel.

Pendahuluan

Tujuan Pembelajaran

Setelah pertemuan ini, kamu diharapkan mampu:

  • Mendeklarasikan, mengisi, dan mengakses elemen array satu dimensi.
  • Menelusuri array menggunakan for dan enhanced for (for-each).
  • Melakukan operasi umum: jumlah, rata-rata, nilai maksimum/minimum, pencarian, dan pembalikan.
  • Menggunakan class Arrays untuk mengurutkan, mencetak, dan menyalin array.
  • Membuat dan mengolah array dua dimensi (matriks).
  • Menggunakan ArrayList beserta method-nya, termasuk fitur Java 21 seperti getFirst(), getLast(), dan reversed().

Alokasi Waktu Pertemuan Ini

Sesi Topik Durasi
Materi 1 Review & konsep array 10 menit
Materi 2 Deklarasi, akses, dan penelusuran array 20 menit
Materi 3 Operasi umum pada array 15 menit
Materi 4 Class Arrays 10 menit
Materi 5 Array dua dimensi 15 menit
Materi 6 ArrayList 20 menit
Materi 7 List.of, immutable list & fitur Java 21 10 menit
Materi 8 Studi kasus: rekap nilai kelas 20 menit
Total Materi 2 jam
Latihan Latihan Mandiri 1 jam
Total 3 jam

Review Singkat

  • for digunakan ketika jumlah pengulangan diketahui, sering dengan variabel indeks i.
  • Indeks pada String dimulai dari 0; hal yang sama berlaku pada array.
  • Pola umum akumulator: total += nilai; di dalam perulangan.

Konsep Array

Array adalah kumpulan elemen bertipe sama yang disimpan berurutan di memori dan diakses menggunakan indeks yang dimulai dari 0.

1
2
3
4
Indeks :   0     1     2     3     4
┌─────┬─────┬─────┬─────┬─────┐
nilai = │ 80 │ 75 │ 90 │ 65 │ 85 │ nilai.length = 5
└─────┴─────┴─────┴─────┴─────┘

Ciri-ciri array di Java:

  • Ukuran tetap setelah dibuat.
  • Semua elemen bertipe sama.
  • Indeks valid: 0 sampai length - 1.
  • Array adalah objek, sehingga punya properti length (tanpa tanda kurung).

Deklarasi, Akses, dan Penelusuran

Membuat Array

1
2
3
4
5
6
7
8
// 1. Menentukan ukuran saja (elemen terisi nilai default)
int[] nilai = new int[5]; // [0, 0, 0, 0, 0]
String[] nama = new String[3]; // [null, null, null]

// 2. Langsung mengisi nilai (initializer)
int[] angka = {10, 20, 30, 40, 50};
String[] hari = {"Senin", "Selasa", "Rabu"};
double[] harga = {2500.5, 4000, 12000};

Nilai default: 0 untuk int, 0.0 untuk double, false untuk boolean, '\u0000' untuk char, dan null untuk objek seperti String.

Mengakses dan Mengubah Elemen

1
2
3
4
5
6
7
8
9
int[] angka = {10, 20, 30, 40, 50};

System.out.println(angka[0]); // 10 (elemen pertama)
System.out.println(angka[angka.length - 1]); // 50 (elemen terakhir)

angka[2] = 99; // mengubah elemen ke-3
System.out.println(angka[2]); // 99

System.out.println(angka[5]); // ArrayIndexOutOfBoundsException!

Menelusuri Array

1
2
3
4
5
6
7
8
9
10
11
String[] buah = {"Apel", "Jeruk", "Mangga"};

// for biasa: cocok bila membutuhkan indeks
for (int i = 0; i < buah.length; i++) {
System.out.println((i + 1) + ". " + buah[i]);
}

// enhanced for (for-each): lebih ringkas bila hanya butuh nilainya
for (String b : buah) {
System.out.println(b);
}

Gunakan for biasa jika perlu mengubah elemen atau memakai indeks, dan for-each jika hanya membaca setiap elemen.

Mengisi Array dari Input

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.Scanner;

public class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);

System.out.print("Jumlah mahasiswa: ");
int n = input.nextInt();
double[] nilai = new double[n]; // ukuran array bisa ditentukan saat program berjalan

for (int i = 0; i < n; i++) {
System.out.print("Nilai mahasiswa ke-" + (i + 1) + ": ");
nilai[i] = input.nextDouble();
}

System.out.println("Data tersimpan: " + nilai.length + " nilai");
input.close();
}
}

Array Bersifat Referensi

Variabel array menyimpan alamat (referensi) ke array, bukan salinan isinya.

1
2
3
4
5
6
7
8
int[] a = {1, 2, 3};
int[] b = a; // b menunjuk ke array yang SAMA
b[0] = 99;
System.out.println(a[0]); // 99, ikut berubah!

int[] c = a.clone(); // salinan baru
c[0] = 1;
System.out.println(a[0]); // tetap 99

Operasi Umum pada Array

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
int[] data = {45, 78, 12, 90, 33, 67};

// 1. Jumlah dan rata-rata
int jumlah = 0;
for (int x : data) {
jumlah += x;
}
double rata = (double) jumlah / data.length;

// 2. Nilai maksimum dan minimum
int maks = data[0];
int min = data[0];
for (int i = 1; i < data.length; i++) {
if (data[i] > maks) maks = data[i];
if (data[i] < min) min = data[i];
}

// 3. Pencarian linear
int dicari = 90;
int posisi = -1;
for (int i = 0; i < data.length; i++) {
if (data[i] == dicari) {
posisi = i;
break;
}
}

// 4. Membalik isi array
for (int i = 0; i < data.length / 2; i++) {
int sementara = data[i];
data[i] = data[data.length - 1 - i];
data[data.length - 1 - i] = sementara;
}

System.out.printf("Jumlah=%d Rata=%.2f Maks=%d Min=%d Posisi(90)=%d%n", jumlah, rata, maks, min, posisi);

Perhatikan pola swap (tukar) menggunakan variabel sementara: pola ini akan dipakai ulang pada algoritma pengurutan.

Class Arrays

Class java.util.Arrays menyediakan banyak method siap pakai.

Method Fungsi
Arrays.toString(arr) Mengubah array menjadi teks [1, 2, 3]
Arrays.sort(arr) Mengurutkan secara menaik (ascending)
Arrays.fill(arr, nilai) Mengisi semua elemen dengan nilai tertentu
Arrays.copyOf(arr, n) Menyalin dengan panjang baru n
Arrays.copyOfRange(arr, a, b) Menyalin dari indeks a hingga sebelum b
Arrays.equals(a, b) Membandingkan isi dua array
Arrays.binarySearch(arr, x) Mencari nilai pada array yang sudah terurut
Arrays.stream(arr).sum() Menjumlahkan semua elemen
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.Arrays;

public class Main {
public static void main(String[] args) {
int[] angka = {5, 2, 9, 1, 7};

System.out.println(angka); // [I@... (alamat, bukan isi)
System.out.println(Arrays.toString(angka)); // [5, 2, 9, 1, 7]

Arrays.sort(angka);
System.out.println(Arrays.toString(angka)); // [1, 2, 5, 7, 9]

int posisi = Arrays.binarySearch(angka, 7); // 3
int[] tigaPertama = Arrays.copyOf(angka, 3); // [1, 2, 5]

System.out.println("Jumlah : " + Arrays.stream(angka).sum());
System.out.println("Rata : " + Arrays.stream(angka).average().orElse(0));
}
}

Mencetak array langsung dengan println(arr) tidak menampilkan isinya. Selalu gunakan Arrays.toString() (atau Arrays.deepToString() untuk 2D).

Array Dua Dimensi

Array 2D menyimpan data berbentuk baris dan kolom (tabel atau matriks).

1
2
3
4
5
6
7
8
9
int[][] matriks = {
{1, 2, 3},
{4, 5, 6},
{7, 8, 9}
};

System.out.println(matriks[1][2]); // 6 (baris 1, kolom 2)
System.out.println(matriks.length); // 3 (jumlah baris)
System.out.println(matriks[0].length); // 3 (jumlah kolom pada baris 0)

Menelusuri dengan nested loop:

1
2
3
4
5
6
for (int baris = 0; baris < matriks.length; baris++) {
for (int kolom = 0; kolom < matriks[baris].length; kolom++) {
System.out.printf("%3d", matriks[baris][kolom]);
}
System.out.println();
}

Membuat matriks kosong dan mengisinya, misalnya tabel perkalian:

1
2
3
4
5
6
7
8
int[][] tabel = new int[5][5];

for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
tabel[i][j] = (i + 1) * (j + 1);
}
}
System.out.println(Arrays.deepToString(tabel));

Penjumlahan dua matriks A + B = C:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int[][] a = {
{1, 2},
{3, 4}
};
int[][] b = {
{5, 6},
{7, 8}
};
int[][] c = new int[2][2];

for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
c[i][j] = a[i][j] + b[i][j];
}
}

Array 2D juga boleh memiliki panjang baris berbeda (jagged array), misalnya new int[3][] lalu setiap baris dibuat sendiri-sendiri.

ArrayList

Array memiliki ukuran tetap. Ketika jumlah data berubah-ubah (menambah atau menghapus), gunakan ArrayList, yaitu daftar dinamis yang ukurannya bertambah/berkurang otomatis.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import java.util.ArrayList;
import java.util.List;

public class Main {
public static void main(String[] args) {
List<String> daftar = new ArrayList<>();

daftar.add("Apel");
daftar.add("Jeruk");
daftar.add("Mangga");
daftar.add(1, "Pisang"); // menyisipkan pada indeks 1

System.out.println(daftar); // [Apel, Pisang, Jeruk, Mangga]
System.out.println(daftar.size()); // 4
System.out.println(daftar.get(0)); // Apel

daftar.set(0, "Anggur"); // mengganti elemen indeks 0
daftar.remove("Jeruk"); // menghapus berdasarkan nilai
daftar.remove(0); // menghapus berdasarkan indeks

System.out.println(daftar.contains("Mangga")); // true
System.out.println(daftar.indexOf("Mangga")); // posisi, -1 jika tidak ada
System.out.println(daftar.isEmpty()); // false

for (String buah : daftar) {
System.out.println(buah);
}
}
}

Method yang sering dipakai:

Method Fungsi
add(x) / add(i, x) Menambah di akhir / pada indeks tertentu
get(i) Mengambil elemen indeks i
set(i, x) Mengganti elemen indeks i
remove(i) / remove(x) Menghapus berdasarkan indeks / nilai
size() Jumlah elemen (bukan length)
contains(x) / indexOf(x) Mencari elemen
isEmpty() / clear() Cek kosong / hapus semua
Collections.sort(list) Mengurutkan (import java.util.Collections)

ArrayList Tidak Menyimpan Tipe Primitif

Tanda <...> menentukan tipe isi list (generics), dan harus berupa class. Gunakan wrapper class: Integer untuk int, Double untuk double, Boolean untuk boolean, dan Character untuk char. Konversi dari/ke tipe primitif dilakukan otomatis (autoboxing).

1
2
3
4
5
6
7
8
9
10
11
12
List<Integer> angka = new ArrayList<>();
angka.add(10);
angka.add(20);
angka.add(30);

angka.remove(1); // menghapus INDEKS 1 -> [10, 30]
angka.remove(Integer.valueOf(30)); // menghapus NILAI 30 -> [10]

int total = 0;
for (int x : angka) {
total += x;
}

Jebakan: pada List<Integer>, remove(1) dianggap indeks, bukan nilai. Gunakan Integer.valueOf() bila ingin menghapus berdasarkan nilai.

Array vs ArrayList

Array ArrayList
Ukuran Tetap Dinamis
Tipe isi Primitif atau objek Hanya objek (pakai wrapper)
Panjang arr.length list.size()
Akses arr[i] list.get(i)
Method bawaan Sedikit (lewat Arrays) Banyak (add, remove, contains, …)

List.of dan Fitur Java 21

List.of (Immutable)

1
2
3
4
5
List<String> hari = List.of("Senin", "Selasa", "Rabu");
// hari.add("Kamis"); // UnsupportedOperationException: list tidak dapat diubah

List<String> bisaDiubah = new ArrayList<>(List.of("Senin", "Selasa"));
bisaDiubah.add("Rabu"); // OK

Sequenced Collections (Java 21)

Sejak Java 21, List memiliki method untuk mengakses elemen pertama dan terakhir tanpa menghitung indeks, serta membalik urutan:

1
2
3
4
5
6
7
8
List<String> antrean = new ArrayList<>(List.of("Ani", "Budi", "Citra"));

System.out.println(antrean.getFirst()); // Ani
System.out.println(antrean.getLast()); // Citra
System.out.println(antrean.reversed()); // [Citra, Budi, Ani]

antrean.addFirst("Dewi"); // Dewi di depan
antrean.removeLast(); // hapus elemen terakhir

Sebelum Java 21, elemen terakhir harus diambil dengan list.get(list.size() - 1).

Variabel Tanpa Nama _ (Java 22+)

Jika nilai variabel loop tidak dipakai, kita bisa menggunakan _ sebagai unnamed variable untuk menegaskan bahwa variabel itu memang tidak digunakan:

1
2
3
4
5
int jumlahItem = 0;
for (String _ : antrean) {
jumlahItem++;
}
System.out.println("Jumlah antrean: " + jumlahItem);

Argumen Command Line pada main

Parameter String[] args pada main ternyata adalah array yang berisi argumen yang diberikan saat program dijalankan:

1
2
3
4
5
6
7
8
public class Main {
public static void main(String[] args) {
System.out.println("Jumlah argumen: " + args.length);
for (String arg : args) {
System.out.println(arg);
}
}
}

Jalankan dengan java Main.java Halo Java 25, maka args berisi ["Halo", "Java", "25"].

Studi Kasus: Rekap Nilai Kelas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.Arrays;

public class Main {
public static void main(String[] args) {
String[] nama = {"Ani", "Budi", "Citra", "Dimas", "Eka"};
int[] nilai = {85, 72, 90, 65, 78};

// Rata-rata
int jumlah = 0;
for (int n : nilai) {
jumlah += n;
}
double rata = (double) jumlah / nilai.length;

// Nilai tertinggi beserta namanya
int idxMaks = 0;
for (int i = 1; i < nilai.length; i++) {
if (nilai[i] > nilai[idxMaks]) {
idxMaks = i;
}
}

// Cetak tabel
System.out.printf("%-3s %-8s %5s %s%n", "No", "Nama", "Nilai", "Ket");
System.out.println("-".repeat(30));
int diAtasRata = 0;
for (int i = 0; i < nama.length; i++) {
String ket = nilai[i] >= rata ? "di atas rata-rata" : "di bawah rata-rata";
if (nilai[i] >= rata) diAtasRata++;
System.out.printf("%-3d %-8s %5d %s%n", i + 1, nama[i], nilai[i], ket);
}

System.out.println("-".repeat(30));
System.out.printf("Rata-rata : %.2f%n", rata);
System.out.printf("Tertinggi : %s (%d)%n", nama[idxMaks], nilai[idxMaks]);
System.out.println("Di atas rata : " + diAtasRata + " orang");
System.out.println("Nilai terurut : " + Arrays.toString(Arrays.stream(nilai).sorted().toArray()));
}
}

Perhatikan bahwa data nama dan nilai disimpan pada dua array paralel yang indeksnya saling berpasangan. Pada pertemuan lanjutan (Object-Oriented Programming), pasangan data seperti ini akan dibungkus dalam sebuah objek Mahasiswa.

Ringkasan

Kebutuhan Gunakan
Data banyak, ukuran tetap, bertipe primitif Array int[], double[]
Data berbentuk tabel / matriks Array 2D int[][]
Menelusuri semua elemen for-each
Perlu indeks atau mengubah elemen for biasa
Mengurutkan, mencetak, menyalin array Class Arrays
Data dinamis (tambah/hapus) ArrayList
Daftar yang tidak boleh berubah List.of(...)

Latihan

Kerjakan latihan berikut untuk mengetes pemahamanmu. Total durasi latihan adalah 60 menit.

No Latihan Estimasi
1 Statistik Nilai 10 menit
2 Pencarian & Pembalikan Array 10 menit
3 Bubble Sort 10 menit
4 Matriks 10 menit
5 Daftar Belanja dengan ArrayList 10 menit
6 Mini Project: Rekap Nilai Kelas 10 menit
Total 60 menit

Latihan 1: Statistik Nilai (estimasi 10 menit)

Buat program yang meminta jumlah data N, kemudian N buah nilai (bilangan bulat). Tampilkan:

  1. Seluruh data dengan Arrays.toString().
  2. Jumlah, rata-rata, nilai maksimum, dan nilai minimum tanpa memakai Arrays.sort.
  3. Banyak nilai yang lebih besar dari rata-rata.
  4. Banyak bilangan genap dan ganjil.

Latihan 2: Pencarian & Pembalikan Array (estimasi 10 menit)

Dengan array int[] data = {12, 45, 7, 89, 23, 45, 61}:

  1. Minta pengguna memasukkan sebuah angka, lalu tampilkan semua indeks tempat angka itu muncul (atau pesan "tidak ditemukan").
  2. Tampilkan isi array secara terbalik tanpa mengubah array aslinya.
  3. Buat array baru yang berisi hanya elemen unik dari data (tanpa duplikat), misalnya menggunakan ArrayList.

Latihan 3: Bubble Sort (estimasi 10 menit)

Urutkan array {64, 34, 25, 12, 22, 11, 90} secara menaik tanpa Arrays.sort, menggunakan algoritma bubble sort: bandingkan dua elemen bersebelahan, tukar jika urutannya salah, ulangi hingga tidak ada pertukaran.

Petunjuk kerangka:

1
2
3
4
5
6
7
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
// tukar arr[j] dan arr[j + 1]
}
}
}

Cetak array pada setiap putaran luar agar proses pengurutan terlihat. Setelah selesai, bandingkan hasilnya dengan Arrays.sort.

Latihan 4: Matriks (estimasi 10 menit)

  1. Buat matriks 3x3, isi dari input pengguna, lalu tampilkan dalam bentuk tabel.
  2. Hitung jumlah setiap baris, setiap kolom, dan jumlah diagonal utama.
  3. Buat transpose matriks (baris menjadi kolom).
  4. Tantangan: kalikan dua matriks 2x2.

Latihan 5: Daftar Belanja dengan ArrayList (estimasi 10 menit)

Buat program menu berulang (do-while) untuk mengelola daftar belanja:

1
2
3
4
5
1. Tambah barang
2. Hapus barang
3. Tampilkan daftar
4. Cari barang
5. Keluar

Ketentuan:

  • Gunakan ArrayList<String>.
  • Tolak barang yang sudah ada di daftar (contains).
  • Tampilkan daftar bernomor, dan tampilkan pesan khusus bila daftar kosong.
  • Gunakan getFirst() dan getLast() untuk menampilkan barang pertama dan terakhir.

Latihan 6: Mini Project Rekap Nilai Kelas (estimasi 10 menit)

Kembangkan studi kasus rekap nilai:

  1. Input jumlah mahasiswa, lalu nama dan nilai tiap mahasiswa (simpan pada ArrayList<String> dan ArrayList<Integer>).
  2. Hitung grade tiap mahasiswa (A/B/C/D/E) menggunakan switch expression.
  3. Tampilkan tabel rapi dengan printf, serta statistik kelas: rata-rata, tertinggi, terendah, dan jumlah mahasiswa per grade.
  4. Tampilkan 3 nilai teratas (peringkat).

Tantangan tambahan: simpan nilai 3 mata kuliah per mahasiswa pada array 2D int[][] nilai = new int[jumlahMhs][3], lalu hitung rata-rata per mahasiswa dan per mata kuliah.