Java untuk Pemula: 100 Contoh yang Bisa Anda Kompilasi dan Jalankan
Java berjalan di Android, server perusahaan, dan sistem perbankan. Artikel ini mengajarkannya melalui 100 program pendek. Setiap program dikompilasi dengan javac 17 dan dijalankan, dan keluaran sebenarnya ditampilkan setelah kodenya. Contohnya bergerak dari mencetak teks dan menyimpan nilai sampai ke class, koleksi, exception, lambda, dan stream. Baca penjelasan untuk setiap kelompok, lalu ketik sendiri setiap contohnya, karena mengetik program adalah cara tercepat untuk mempelajarinya.
Yang Anda butuhkan
Pasang JDK 17 atau yang lebih baru, yang menyediakan javac (kompiler) dan java (penjalan). Periksa pemasangannya dengan javac -version dan java -version. Editor teks biasa sudah cukup. Tidak diperlukan pengalaman pemrograman, tetapi contoh pertama mengandaikan Anda tahu apa itu angka dan kata.
Cara mengompilasi dan menjalankan
javac -encoding UTF-8 -d out src/Ex001HelloWorld.java
java -Dfile.encoding=UTF-8 -cp out Ex001HelloWorld
Ilustrasi
Topik 1: Keluaran, variabel, dan tipe
Setiap program Java dimulai dari sebuah class dan method main. Contoh-contoh ini menunjukkan cara mencetak teks, menyimpan nilai dalam variabel, dan memilih tipe yang tepat untuk setiap nilai.
Struktur program
Berkas Java berisi sebuah class, dan class itu berisi public static void main(String[] args). JVM memanggil main terlebih dahulu. System.out.println mencetak satu baris dan pindah ke baris berikutnya, sedangkan System.out.print tetap di baris yang sama. Nama berkas harus sama dengan nama class publiknya, jadi Ex001HelloWorld.java berisi class Ex001HelloWorld.
Tipe primitif
int menyimpan bilangan bulat dari sekitar -2,1 miliar sampai 2,1 miliar, long menyimpan bilangan bulat yang lebih besar, double menyimpan desimal dengan sekitar 15 digit signifikan, boolean menampung true atau false, dan char menampung satu karakter Unicode. Java memeriksa tipe saat kompilasi, jadi int x = 3.5; adalah error kompilasi, bukan pemotongan diam-diam.
var dan text block
var membiarkan kompiler menyimpulkan tipe dari nilai di sisi kanan, seperti var n = 10;. Tipenya tetap int dan tidak bisa berubah kemudian. Text block, yang ditulis di antara tiga tanda kutip ganda, membuat teks multibaris mudah dibaca. Nilai desimal tidak tepat dalam biner: 0.1 + 0.2 menghasilkan 0.30000000000000004, jadi bandingkan desimal dengan toleransi kecil.
Contoh 1: Halo Dunia
Cetak pesan pertama dengan System.out.println.
public class Ex001HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
Keluaran:
Hello, World!
Contoh 2: Mencetak baris
print, println, dan karakter escape seperti tab dan tanda kutip.
public class Ex002PrintLines {
public static void main(String[] args) {
System.out.println("First line");
System.out.print("Same line, ");
System.out.println("continued");
System.out.println("Tab:\tafter tab");
System.out.println("Quote: \"hello\"");
}
}
Keluaran:
First line
Same line, continued
Tab: after tab
Quote: "hello"
Contoh 3: Variabel
Simpan nilai dalam variabel dan ubah nilainya.
public class Ex003Variables {
public static void main(String[] args) {
int apples = 5;
int bought = 3;
apples = apples + bought;
System.out.println("Apples now: " + apples);
}
}
Keluaran:
Apples now: 8
Contoh 4: Tipe bilangan bulat
byte, int, dan long, serta apa yang terjadi ketika int meluap.
public class Ex004IntegerTypes {
public static void main(String[] args) {
byte small = 100;
int medium = 2_000_000_000;
long big = 9_000_000_000L;
System.out.println("byte: " + small);
System.out.println("int: " + medium);
System.out.println("long: " + big);
int overflow = Integer.MAX_VALUE;
overflow = overflow + 1;
System.out.println("overflow: " + overflow);
}
}
Keluaran:
byte: 100
int: 2000000000
long: 9000000000
overflow: -2147483648
Contoh 5: Bilangan pecahan
double dan float, dan mengapa 0.1 + 0.2 tidak tepat sama dengan 0.3.
public class Ex005Floating {
public static void main(String[] args) {
double a = 0.1 + 0.2;
System.out.println("0.1 + 0.2 = " + a);
float f = 1.5f;
System.out.println("float: " + f);
System.out.println("rounded: " + Math.round(a * 100) / 100.0);
}
}
Keluaran:
0.1 + 0.2 = 0.30000000000000004
float: 1.5
rounded: 0.3
Contoh 6: Nilai boolean
true dan false, serta mencetak hasil sebuah boolean.
public class Ex006Booleans {
public static void main(String[] args) {
boolean isJavaFun = true;
boolean isRaining = false;
System.out.println("Java is fun: " + isJavaFun);
System.out.println("Raining: " + isRaining);
System.out.println("Not raining: " + !isRaining);
}
}
Keluaran:
Java is fun: true
Raining: false
Not raining: true
Contoh 7: Karakter
Sebuah char menampung satu karakter, dan kode Unicode-nya bisa dibaca.
public class Ex007Chars {
public static void main(String[] args) {
char letter = 'A';
char next = (char) (letter + 1);
System.out.println("letter: " + letter);
System.out.println("next: " + next);
System.out.println("code of A: " + (int) letter);
char accented = 'é';
System.out.println("unicode char: " + accented);
}
}
Keluaran:
letter: A
next: B
code of A: 65
unicode char: é
Contoh 8: Konstanta
final membuat nilai yang tidak bisa berubah setelah diberi nilai.
public class Ex008Constants {
static final double PI_APPROX = 3.14159;
public static void main(String[] args) {
final int MAX_USERS = 100;
System.out.println("Max users: " + MAX_USERS);
System.out.println("Pi: " + PI_APPROX);
}
}
Keluaran:
Max users: 100
Pi: 3.14159
Contoh 9: Kata kunci var
Java menyimpulkan tipe dari nilai di sisi kanan.
import java.util.ArrayList;
import java.util.List;
public class Ex009VarKeyword {
public static void main(String[] args) {
var name = "Budi";
var age = 25;
List<String> tags = new ArrayList<>();
tags.add("java");
System.out.println(name + " is " + age);
System.out.println("tags: " + tags);
}
}
Keluaran:
Budi is 25
tags: [java]
Contoh 10: Text block
String multibaris yang ditulis di antara tiga tanda kutip.
public class Ex010TextBlocks {
public static void main(String[] args) {
String html = """
<html>
<body>Hello</body>
</html>
""";
System.out.print(html);
}
}
Keluaran:
<html>
<body>Hello</body>
</html>
Topik 2: Operator dan konversi tipe
Operator menggabungkan nilai. Kelompok ini mencakup aritmetika, perbandingan, logika, operasi bit, dan konversi antartipe.
Aritmetika dan pembagian bilangan bulat
+, -, *, / dan % bekerja seperti yang diharapkan, tetapi int dibagi int membuang pecahannya: 7 / 2 hasilnya 3. Tulis 7.0 / 2 atau ubah salah satu operand menjadi double untuk mempertahankan bagian desimal. Operator % memberi sisa bagi, dan ++ serta -- mengubah variabel satu per satu.
Operator perbandingan dan logika
==, !=, <, >, <= dan >= menghasilkan boolean. && dan || melakukan short-circuit, sehingga sisi kanan hanya dijalankan jika diperlukan. Kesalahan umum adalah memakai == untuk membandingkan string. Itu membandingkan identitas objek, jadi gunakan equals untuk teks.
Operasi bit, shift, dan cast
&, |, ^ dan ~ bekerja pada bit individual. << dan >> menggeser bit ke kiri dan kanan, yang mengalikan atau membagi dengan pangkat dua. Cast seperti (int) 9.99 menghasilkan 9, karena bagian desimalnya dipotong, bukan dibulatkan.
Contoh 11: Operator aritmetika
+, -, *, / dan % pada bilangan bulat.
public class Ex011Arithmetic {
public static void main(String[] args) {
int a = 17, b = 5;
System.out.println("a + b = " + (a + b));
System.out.println("a - b = " + (a - b));
System.out.println("a * b = " + (a * b));
System.out.println("a / b = " + (a / b));
System.out.println("a % b = " + (a % b));
}
}
Keluaran:
a + b = 22
a - b = 12
a * b = 85
a / b = 3
a % b = 2
Contoh 12: Pembagian bilangan bulat
Membagi dua int membuang pecahannya; gunakan double untuk mempertahankannya.
public class Ex012IntegerDivision {
public static void main(String[] args) {
System.out.println("7 / 2 = " + (7 / 2));
System.out.println("7.0 / 2 = " + (7.0 / 2));
System.out.println("(double) 7 / 2 = " + ((double) 7 / 2));
System.out.println("-7 % 3 = " + (-7 % 3));
}
}
Keluaran:
7 / 2 = 3
7.0 / 2 = 3.5
(double) 7 / 2 = 3.5
-7 % 3 = -1
Contoh 13: Increment dan decrement
++ dan -- sebelum dan sesudah nilai memberikan hasil yang berbeda.
public class Ex013IncrementDecrement {
public static void main(String[] args) {
int x = 5;
System.out.println("x++ gives " + x++ + ", now " + x);
System.out.println("++x gives " + ++x + ", now " + x);
System.out.println("x-- gives " + x-- + ", now " + x);
}
}
Keluaran:
x++ gives 5, now 6
++x gives 7, now 7
x-- gives 7, now 6
Contoh 14: Assignment majemuk
+=, -=, *= dan /= memperbarui variabel dalam satu langkah.
public class Ex014CompoundAssignment {
public static void main(String[] args) {
int score = 10;
score += 5;
System.out.println("after += 5: " + score);
score *= 2;
System.out.println("after *= 2: " + score);
score -= 4;
System.out.println("after -= 4: " + score);
score /= 3;
System.out.println("after /= 3: " + score);
}
}
Keluaran:
after += 5: 15
after *= 2: 30
after -= 4: 26
after /= 3: 8
Contoh 15: Operator perbandingan
==, !=, < dan >= membandingkan nilai dan menghasilkan true atau false.
public class Ex015Comparison {
public static void main(String[] args) {
int a = 10, b = 20;
System.out.println("a == b: " + (a == b));
System.out.println("a != b: " + (a != b));
System.out.println("a < b: " + (a < b));
System.out.println("a >= b: " + (a >= b));
}
}
Keluaran:
a == b: false
a != b: true
a < b: true
a >= b: false
Contoh 16: Operator logika
&& (dan), || (atau), dan ! (tidak) menggabungkan kondisi.
public class Ex016Logical {
public static void main(String[] args) {
boolean hasTicket = true;
boolean isAdult = false;
System.out.println("AND: " + (hasTicket && isAdult));
System.out.println("OR: " + (hasTicket || isAdult));
System.out.println("NOT: " + !hasTicket);
}
}
Keluaran:
AND: false
OR: true
NOT: false
Contoh 17: Operator bitwise
&, |, ^ dan ~ bekerja pada bit-bit sebuah bilangan bulat.
public class Ex017Bitwise {
public static void main(String[] args) {
int a = 12; // 1100
int b = 10; // 1010
System.out.println("a & b = " + (a & b));
System.out.println("a | b = " + (a | b));
System.out.println("a ^ b = " + (a ^ b));
System.out.println("~a = " + (~a));
}
}
Keluaran:
a & b = 8
a | b = 14
a ^ b = 6
~a = -13
Contoh 18: Operator shift
<< dan >> memindahkan bit; >>> mengisi sisi kiri dengan nol.
public class Ex018Shifts {
public static void main(String[] args) {
int n = 5;
System.out.println("5 << 2 = " + (n << 2));
System.out.println("5 >> 1 = " + (n >> 1));
System.out.println("-8 >>> 28 = " + (-8 >>> 28));
}
}
Keluaran:
5 << 2 = 20
5 >> 1 = 2
-8 >>> 28 = 15
Contoh 19: Konversi tipe
Ubah antartipe dengan (int) dan (double).
public class Ex019Casting {
public static void main(String[] args) {
double price = 19.99;
int whole = (int) price;
System.out.println("(int) 19.99 = " + whole);
long big = 100000L;
int small = (int) big;
System.out.println("long to int: " + small);
System.out.println("int to double: " + (double) 7 / 2);
}
}
Keluaran:
(int) 19.99 = 19
long to int: 100000
int to double: 3.5
Contoh 20: Operator ternary
Pilih salah satu dari dua nilai dalam satu baris dengan ?:.
public class Ex020Ternary {
public static void main(String[] args) {
int age = 17;
String status = age >= 18 ? "adult" : "minor";
System.out.println("Status: " + status);
int max = Math.max(3, 9);
System.out.println("Max: " + max);
}
}
Keluaran:
Status: minor
Max: 9
Topik 3: Keputusan dengan if dan switch
Program memilih jalur dengan if dan switch. Java 14 ke atas juga menyediakan ekspresi switch, yang mengembalikan nilai.
if, else if, dan else
Kondisi diuji dari atas ke bawah, dan cabang bernilai benar pertama yang dijalankan. Letakkan pemeriksaan yang paling spesifik di awal. Jika pemeriksaan yang luas ditaruh lebih dulu, ia akan menangkap nilai sebelum pemeriksaan yang spesifik bisa melihatnya.
Pernyataan switch dan ekspresi switch
switch klasik memerlukan break, jika tidak eksekusi akan jatuh ke case berikutnya. Ekspresi switch dengan -> tidak jatuh ke case lain, dan ia mengembalikan nilai, jadi lebih aman dan lebih mudah dibaca.
Operator ternary
condition ? a : b memilih salah satu dari dua nilai. Cocok untuk pilihan singkat. Ternary bersarang sulit dibaca, jadi gunakan if ketika hasilnya lebih dari dua.
Contoh 21: if, else if, dan else
Pilih cabang berdasarkan nilai.
public class Ex021IfElse {
public static void main(String[] args) {
int score = 72;
if (score >= 80) {
System.out.println("Grade A");
} else if (score >= 70) {
System.out.println("Grade B");
} else {
System.out.println("Grade C or lower");
}
}
}
Keluaran:
Grade B
Contoh 22: Pernyataan switch
Jalankan kode untuk case yang cocok; break menghentikan jatuhnya eksekusi.
public class Ex022SwitchStatement {
public static void main(String[] args) {
int day = 3;
switch (day) {
case 1: System.out.println("Monday"); break;
case 2: System.out.println("Tuesday"); break;
case 3: System.out.println("Wednesday"); break;
default: System.out.println("Other day");
}
}
}
Keluaran:
Wednesday
Contoh 23: Ekspresi switch
Kembalikan nilai dari switch dengan sintaks panah.
public class Ex023SwitchExpression {
public static void main(String[] args) {
String fruit = "apple";
int price = switch (fruit) {
case "apple" -> 10;
case "banana" -> 5;
default -> 0;
};
System.out.println(fruit + " costs " + price);
}
}
Keluaran:
apple costs 10
Topik 4: Perulangan dan pernyataan lompat
Perulangan mengulang sebuah blok kode. Pilih perulangan yang sesuai dengan pekerjaannya: for untuk jumlah yang sudah diketahui, while untuk kondisi, dan for yang disempurnakan untuk setiap item dalam koleksi.
for, while, dan do-while
for cocok untuk jumlah putaran yang sudah diketahui. while memeriksa kondisinya sebelum setiap putaran, sehingga bisa berjalan nol kali. do-while menjalankan badannya setidaknya sekali lalu memeriksa kondisinya.
for yang disempurnakan
for (String s : list) mengunjungi setiap item tanpa variabel indeks. Jangan menambah atau menghapus item dalam daftar di dalam perulangan ini, jika tidak Java akan melempar ConcurrentModificationException.
break, continue, dan label
break keluar dari perulangan seketika. continue melompat ke putaran berikutnya. Label seperti outer: memungkinkan break keluar dari perulangan bersarang, yang tidak bisa dilakukan break biasa.
Contoh 24: Perulangan while
Ulangi badannya selama kondisi tetap benar.
public class Ex024WhileLoop {
public static void main(String[] args) {
int count = 1;
while (count <= 5) {
System.out.println("count = " + count);
count++;
}
}
}
Keluaran:
count = 1
count = 2
count = 3
count = 4
count = 5
Contoh 25: Perulangan do-while
Jalankan badannya setidaknya sekali, lalu periksa kondisinya.
public class Ex025DoWhileLoop {
public static void main(String[] args) {
int n = 10;
do {
System.out.println("runs once even though n = " + n);
n++;
} while (n < 5);
}
}
Keluaran:
runs once even though n = 10
Contoh 26: Perulangan for
Hitung dengan indeks; contoh ini menjumlahkan angka 1 sampai 10.
public class Ex026ForLoop {
public static void main(String[] args) {
int total = 0;
for (int i = 1; i <= 10; i++) {
total += i;
}
System.out.println("Sum 1..10 = " + total);
}
}
Keluaran:
Sum 1..10 = 55
Contoh 27: for yang disempurnakan
Kunjungi setiap item array tanpa indeks.
public class Ex027EnhancedFor {
public static void main(String[] args) {
String[] colours = {"red", "green", "blue"};
for (String c : colours) {
System.out.println("colour: " + c);
}
}
}
Keluaran:
colour: red
colour: green
colour: blue
Contoh 28: break
Keluar dari perulangan lebih awal ketika sebuah kondisi terpenuhi.
public class Ex028BreakLoop {
public static void main(String[] args) {
for (int i = 1; i <= 10; i++) {
if (i == 4) {
System.out.println("Stop at " + i);
break;
}
System.out.println("i = " + i);
}
}
}
Keluaran:
i = 1
i = 2
i = 3
Stop at 4
Contoh 29: continue
Lewati sisa langkah saat ini dan lanjut ke langkah berikutnya.
public class Ex029ContinueLoop {
public static void main(String[] args) {
for (int i = 1; i <= 6; i++) {
if (i % 2 == 0) {
continue;
}
System.out.println("odd: " + i);
}
}
}
Keluaran:
odd: 1
odd: 3
odd: 5
Contoh 30: break dengan label
Keluar dari dua perulangan bersarang sekaligus.
public class Ex030LabeledBreak {
public static void main(String[] args) {
outer:
for (int i = 1; i <= 3; i++) {
for (int j = 1; j <= 3; j++) {
if (i * j == 4) {
System.out.println("Found 4 at i=" + i + ", j=" + j);
break outer;
}
}
}
System.out.println("Done");
}
}
Keluaran:
Found 4 at i=2, j=2
Done
Topik 5: Algoritma bilangan
Program kecil yang menyelesaikan masalah klasik menunjukkan bagaimana perulangan, kondisi, dan aritmetika bekerja bersama.
Menghitung dan menjumlahkan
Atur variabel total ke 0 sebelum perulangan dan tambahkan ke dalamnya di dalam perulangan. Untuk menjumlahkan digit, n % 10 memberi digit terakhir dan n / 10 membuangnya. Ulangi sampai n menjadi 0.
Bilangan prima, faktorial, dan Fibonacci
Uji bilangan prima hanya perlu membagi sampai akar kuadrat dari n. Faktorial dan bilangan Fibonacci tumbuh dengan cepat, dan int meluap pada 13! serta setelah bilangan Fibonacci ke-46, jadi gunakan long, atau BigInteger untuk nilai yang lebih besar.
Faktor persekutuan terbesar dan palindrom
Algoritma Euclid mengganti (a, b) dengan (b, a % b) sampai b menjadi nol, dan kemudian a adalah jawabannya. Pemeriksaan palindrom membalik digit dan membandingkan hasilnya dengan angka asli.
Contoh 31: Tabel perkalian
Perulangan bersarang mencetak tabel kecil hasil kali.
public class Ex031MultiplicationTable {
public static void main(String[] args) {
for (int i = 1; i <= 3; i++) {
StringBuilder row = new StringBuilder();
for (int j = 1; j <= 5; j++) {
row.append(i * j).append('\t');
}
System.out.println(row.toString().trim());
}
}
}
Keluaran:
1 2 3 4 5
2 4 6 8 10
3 6 9 12 15
Contoh 32: FizzBuzz
Latihan klasik dengan memakai keterbagian oleh 3 dan 5.
public class Ex032FizzBuzz {
public static void main(String[] args) {
for (int i = 1; i <= 15; i++) {
if (i % 15 == 0) System.out.println("FizzBuzz");
else if (i % 3 == 0) System.out.println("Fizz");
else if (i % 5 == 0) System.out.println("Buzz");
else System.out.println(i);
}
}
}
Keluaran:
1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
Contoh 33: Jumlah digit
Gunakan % dan / untuk menjumlahkan digit sebuah angka.
public class Ex033SumOfDigits {
public static void main(String[] args) {
int n = 98765;
int sum = 0;
while (n > 0) {
sum += n % 10;
n /= 10;
}
System.out.println("Digit sum = " + sum);
}
}
Keluaran:
Digit sum = 35
Contoh 34: Pemeriksaan bilangan prima
Uji pembagi hanya sampai akar kuadrat dari bilangannya.
public class Ex034PrimeCheck {
static boolean isPrime(int n) {
if (n < 2) return false;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) return false;
}
return true;
}
public static void main(String[] args) {
for (int n : new int[]{1, 2, 9, 11, 29}) {
System.out.println(n + " prime? " + isPrime(n));
}
}
}
Keluaran:
1 prime? false
2 prime? true
9 prime? false
11 prime? true
29 prime? true
Contoh 35: Bilangan Fibonacci
Cetak sepuluh bilangan pertama dari deret Fibonacci.
public class Ex035Fibonacci {
public static void main(String[] args) {
long a = 0, b = 1;
for (int i = 0; i < 10; i++) {
System.out.print(a + " ");
long next = a + b;
a = b;
b = next;
}
System.out.println();
}
}
Keluaran:
0 1 1 2 3 5 8 13 21 34
Contoh 36: Faktorial
Kalikan 2 sampai 15 dengan long agar hasilnya tidak meluap.
public class Ex036Factorial {
public static void main(String[] args) {
long result = 1;
for (int i = 2; i <= 15; i++) {
result *= i;
}
System.out.println("15! = " + result);
}
}
Keluaran:
15! = 1307674368000
Contoh 37: Faktor persekutuan terbesar
Algoritma Euclid dengan perulangan.
public class Ex037GCD {
static int gcd(int a, int b) {
while (b != 0) {
int t = b;
b = a % b;
a = t;
}
return a;
}
public static void main(String[] args) {
System.out.println("gcd(48, 18) = " + gcd(48, 18));
System.out.println("gcd(17, 5) = " + gcd(17, 5));
}
}
Keluaran:
gcd(48, 18) = 6
gcd(17, 5) = 1
Contoh 38: Bilangan palindrom
Balik digitnya dan bandingkan dengan aslinya.
public class Ex038Palindrome {
public static void main(String[] args) {
int original = 12321;
int n = original, reversed = 0;
while (n > 0) {
reversed = reversed * 10 + n % 10;
n /= 10;
}
System.out.println(original + " palindrome? " + (original == reversed));
}
}
Keluaran:
12321 palindrome? true
Contoh 39: Menghitung huruf vokal
Telusuri karakter dan hitung a, e, i, o, dan u.
public class Ex039CountVowels {
public static void main(String[] args) {
String text = "Programming in Java is fun";
int count = 0;
for (char c : text.toLowerCase().toCharArray()) {
if ("aeiou".indexOf(c) >= 0) count++;
}
System.out.println("Vowels: " + count);
}
}
Keluaran:
Vowels: 8
Contoh 40: Segitiga bintang
Bangun segitiga bintang dengan String.repeat.
public class Ex040StarTriangle {
public static void main(String[] args) {
for (int row = 1; row <= 4; row++) {
System.out.println("*".repeat(row));
}
}
}
Keluaran:
*
**
***
****
Topik 6: Array
Array memiliki panjang tetap dan menyimpan nilai dari satu tipe. Nomor indeks dimulai dari 0.
Deklarasi dan pengindeksan
int[] a = new int[5]; membuat lima nol. a.length adalah ukurannya, ditulis tanpa tanda kurung. Indeks 5 pada array dengan panjang 5 melempar ArrayIndexOutOfBoundsException, karena indeks yang valid adalah 0 sampai 4.
Array dua dimensi
int[][] m adalah array dari array. Baris boleh memiliki panjang berbeda. Gunakan perulangan for bersarang, dengan m.length untuk jumlah baris dan m[r].length untuk jumlah kolom pada baris r.
Pencarian, pengurutan, dan penyalinan
Pencarian linear memeriksa setiap item secara berurutan. Bubble sort menukar tetangga dan membutuhkan waktu sebanding dengan n kuadrat, yang tidak masalah untuk data kecil. Arrays.sort lebih cepat dan merupakan pilihan yang tepat dalam kode sungguhan. Tanda = biasa menyalin referensi, bukan datanya, jadi gunakan Arrays.copyOf atau clone untuk salinan yang sebenarnya.
Contoh 41: Deklarasi array
Buat array dengan nilai, atau dengan ukuran tetap.
public class Ex041DeclareArray {
public static void main(String[] args) {
int[] numbers = {10, 20, 30, 40};
int[] empty = new int[3];
System.out.println("numbers: " + java.util.Arrays.toString(numbers));
System.out.println("empty: " + java.util.Arrays.toString(empty));
}
}
Keluaran:
numbers: [10, 20, 30, 40]
empty: [0, 0, 0]
Contoh 42: Panjang dan indeks array
Baca panjangnya dan ubah elemen berdasarkan indeksnya.
public class Ex042ArrayAccess {
public static void main(String[] args) {
String[] names = {"Ann", "Ben", "Cat"};
System.out.println("length = " + names.length);
System.out.println("first = " + names[0]);
names[1] = "Bob";
System.out.println("second now = " + names[1]);
}
}
Keluaran:
length = 3
first = Ann
second now = Bob
Contoh 43: Array dua dimensi
Array dari array, dipakai sebagai baris dan kolom.
public class Ex043TwoDimensional {
public static void main(String[] args) {
int[][] grid = {
{1, 2, 3},
{4, 5, 6}
};
System.out.println("rows = " + grid.length + ", cols = " + grid[0].length);
System.out.println("grid[1][2] = " + grid[1][2]);
}
}
Keluaran:
rows = 2, cols = 3
grid[1][2] = 6
Contoh 44: Matriks identitas
Isi matriks 3 kali 3 dengan 1 pada diagonalnya.
public class Ex044Matrix {
public static void main(String[] args) {
int[][] m = new int[3][3];
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
m[i][j] = (i == j) ? 1 : 0;
}
}
for (int[] row : m) {
System.out.println(java.util.Arrays.toString(row));
}
}
}
Keluaran:
[1, 0, 0]
[0, 1, 0]
[0, 0, 1]
Contoh 45: Jumlah dan rata-rata
Jumlahkan nilai lalu bagi dengan banyaknya nilai.
public class Ex045SumAverage {
public static void main(String[] args) {
int[] scores = {70, 85, 90, 65};
int sum = 0;
for (int s : scores) sum += s;
double avg = (double) sum / scores.length;
System.out.println("sum = " + sum + ", average = " + avg);
}
}
Keluaran:
sum = 310, average = 77.5
Contoh 46: Nilai minimum dan maksimum
Cari nilai terkecil dan terbesar dalam satu kali telusur.
public class Ex046MinMax {
public static void main(String[] args) {
int[] data = {14, 3, 99, -5, 27};
int min = data[0], max = data[0];
for (int v : data) {
if (v < min) min = v;
if (v > max) max = v;
}
System.out.println("min = " + min + ", max = " + max);
}
}
Keluaran:
min = -5, max = 99
Contoh 47: Pencarian linear
Cari sebuah nilai dengan memeriksa satu item setiap kali.
public class Ex047LinearSearch {
public static void main(String[] args) {
int[] items = {4, 8, 15, 16, 23, 42};
int target = 16;
int index = -1;
for (int i = 0; i < items.length; i++) {
if (items[i] == target) {
index = i;
break;
}
}
System.out.println("index of " + target + " = " + index);
}
}
Keluaran:
index of 16 = 3
Contoh 48: Bubble sort
Urutkan dengan menukar tetangga yang urutannya salah.
public class Ex048BubbleSort {
public static void main(String[] args) {
int[] a = {5, 1, 4, 2, 8};
for (int i = 0; i < a.length - 1; i++) {
for (int j = 0; j < a.length - 1 - i; j++) {
if (a[j] > a[j + 1]) {
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
System.out.println(java.util.Arrays.toString(a));
}
}
Keluaran:
[1, 2, 4, 5, 8]
Contoh 49: Arrays.sort
Urutkan dengan pustaka dan cari dengan binarySearch.
import java.util.Arrays;
public class Ex049ArraysSort {
public static void main(String[] args) {
int[] nums = {9, 2, 7, 4};
Arrays.sort(nums);
System.out.println("sorted: " + Arrays.toString(nums));
System.out.println("binary search 7 at " + Arrays.binarySearch(nums, 7));
}
}
Keluaran:
sorted: [2, 4, 7, 9]
binary search 7 at 2
Contoh 50: Menyalin array
Arrays.copyOf membuat array baru yang terpisah dari yang pertama.
import java.util.Arrays;
public class Ex050CopyArray {
public static void main(String[] args) {
int[] original = {1, 2, 3};
int[] copy = Arrays.copyOf(original, 5);
copy[0] = 100;
System.out.println("original: " + Arrays.toString(original));
System.out.println("copy: " + Arrays.toString(copy));
}
}
Keluaran:
original: [1, 2, 3]
copy: [100, 2, 3, 0, 0]
Contoh 51: Membalik array
Tukar item dari kedua ujung menuju tengah.
public class Ex051ReverseArray {
public static void main(String[] args) {
int[] a = {1, 2, 3, 4, 5};
for (int i = 0, j = a.length - 1; i < j; i++, j--) {
int t = a[i];
a[i] = a[j];
a[j] = t;
}
System.out.println(java.util.Arrays.toString(a));
}
}
Keluaran:
[5, 4, 3, 2, 1]
Topik 7: String
String adalah objek di Java, dan isinya tidak bisa berubah setelah dibuat. Method string mengembalikan string baru.
Panjang, charAt, dan perbandingan
length() menghitung karakter dan charAt(i) mengembalikan karakter pada indeks i. Bandingkan teks dengan equals, bukan ==. equalsIgnoreCase membandingkan tanpa memedulikan huruf besar-kecil.
Method umum dan pemisahan
trim, toUpperCase, toLowerCase, isBlank, substring, indexOf, dan split(",") adalah alat sehari-hari. substring(a, b) menyertakan indeks a dan tidak menyertakan indeks b.
StringBuilder dan format
+ yang diulang di dalam perulangan membuat banyak string sementara, jadi gunakan StringBuilder. String.format dan printf memakai %d untuk bilangan bulat, %.2f untuk dua desimal, dan %s untuk teks.
Contoh 52: Panjang dan charAt string
Baca panjang dan karakter pada posisi tertentu.
public class Ex052StringBasics {
public static void main(String[] args) {
String s = "Java";
System.out.println("length = " + s.length());
System.out.println("char at 1 = " + s.charAt(1));
}
}
Keluaran:
length = 4
char at 1 = a
Contoh 53: Penggabungan
Gabungkan teks dengan + dan lihat bagaimana urutan operasi berpengaruh.
public class Ex053Concatenation {
public static void main(String[] args) {
int a = 2, b = 3;
System.out.println("a + b = " + a + b);
System.out.println("sum = " + (a + b));
String s = "x" + 1 + 2;
System.out.println(s);
}
}
Keluaran:
a + b = 23
sum = 5
x12
Contoh 54: Method string
trim, toUpperCase, toLowerCase, dan isBlank.
public class Ex054StringMethods {
public static void main(String[] args) {
String s = " Hello Java ";
System.out.println("[" + s.trim() + "]");
System.out.println(s.toUpperCase().trim());
System.out.println(s.trim().toLowerCase());
System.out.println(s.isBlank());
}
}
Keluaran:
[Hello Java]
HELLO JAVA
hello java
false
Contoh 55: substring dan indexOf
Potong sebagian string dan cari posisi sebuah karakter.
public class Ex055SubstringIndexOf {
public static void main(String[] args) {
String s = "programming";
System.out.println(s.substring(0, 3));
System.out.println(s.substring(3));
System.out.println("index of 'g' = " + s.indexOf('g'));
System.out.println("last index of 'g' = " + s.lastIndexOf('g'));
}
}
Keluaran:
pro
gramming
index of 'g' = 3
last index of 'g' = 10
Contoh 56: equals versus ==
Bandingkan isi string, bukan hanya referensinya.
public class Ex056EqualsVsSame {
public static void main(String[] args) {
String a = "hello";
String b = "hello";
String c = new String("hello");
System.out.println("a == b: " + (a == b));
System.out.println("a == c: " + (a == c));
System.out.println("a.equals(c): " + a.equals(c));
}
}
Keluaran:
a == b: true
a == c: false
a.equals(c): true
Contoh 57: StringBuilder
Bangun teks dengan efisien, lalu balik dan sisipkan.
public class Ex057StringBuilder {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
sb.append("Java").append(' ').append(17);
System.out.println(sb);
sb.reverse();
System.out.println(sb);
sb.insert(0, ">> ");
System.out.println(sb);
}
}
Keluaran:
Java 17
71 avaJ
>> 71 avaJ
Contoh 58: Memisahkan string
Pecah string yang dipisahkan koma menjadi array.
import java.util.Arrays;
public class Ex058SplitString {
public static void main(String[] args) {
String csv = "apple,banana,cherry";
String[] parts = csv.split(",");
System.out.println(Arrays.toString(parts));
System.out.println("count = " + parts.length);
}
}
Keluaran:
[apple, banana, cherry]
count = 3
Contoh 59: String.format
Format angka dengan desimal tetap dan lebar kolom.
public class Ex059StringFormat {
public static void main(String[] args) {
String name = "Mali";
double price = 49.5;
System.out.println(String.format("Item: %s, price: %.2f baht", name, price));
System.out.println(String.format("%5d|%-5d|", 42, 42));
}
}
Keluaran:
Item: Mali, price: 49.50 baht
42|42 |
Contoh 60: Menggabungkan string
String.join memasang pemisah di antara item.
import java.util.List;
public class Ex060JoinStrings {
public static void main(String[] args) {
System.out.println(String.join(" - ", "a", "b", "c"));
List<String> words = List.of("Java", "is", "fun");
System.out.println(String.join(" ", words));
}
}
Keluaran:
a - b - c
Java is fun
Topik 8: Method
Method adalah blok bernama yang menerima input dan mengembalikan hasil. Method membuat logika bisa dipakai ulang dan diberi nama yang jelas.
Parameter dan nilai kembali
Deklarasikan tipe setiap parameter dan tipe kembalinya. void berarti method tidak mengembalikan apa pun. return mengakhiri method dan mengirim nilai kembali ke pemanggil.
Overloading dan varargs
Method bisa memakai nama yang sama ketika daftar parameternya berbeda. Java memilih kecocokan saat kompilasi. Varargs seperti int... nums menerima sejumlah argumen berapa pun, dan di dalam method ia berupa int[].
Pass by value dan rekursi
Java selalu meneruskan salinan. Untuk primitif, salinannya adalah nilainya sendiri. Untuk objek, salinannya adalah referensinya, jadi method bisa mengubah objeknya tetapi tidak bisa membuat variabel pemanggil menunjuk ke objek baru. Method rekursif memanggil dirinya sendiri dan memerlukan kasus dasar, jika tidak ia tidak akan berhenti dan stack akan meluap.
Contoh 61: Method dengan parameter
Method menerima input dan mengembalikan hasil.
public class Ex061MethodParams {
static int add(int a, int b) {
return a + b;
}
public static void main(String[] args) {
System.out.println("3 + 4 = " + add(3, 4));
}
}
Keluaran:
3 + 4 = 7
Contoh 62: Overloading
Nama method yang sama dengan tipe parameter yang berbeda.
public class Ex062Overloading {
static int area(int side) { return side * side; }
static int area(int w, int h) { return w * h; }
static double area(double radius) { return Math.PI * radius * radius; }
public static void main(String[] args) {
System.out.println("square: " + area(4));
System.out.println("rectangle: " + area(3, 5));
System.out.printf("circle: %.2f%n", area(2.0));
}
}
Keluaran:
square: 16
rectangle: 15
circle: 12.57
Contoh 63: Rekursi
Method yang memanggil dirinya sendiri, menghitung faktorial.
public class Ex063RecursionFactorial {
static long factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
public static void main(String[] args) {
System.out.println("5! = " + factorial(5));
System.out.println("10! = " + factorial(10));
}
}
Keluaran:
5! = 120
10! = 3628800
Contoh 64: Varargs
Menerima sejumlah argumen berapa pun.
public class Ex064Varargs {
static int sum(int... numbers) {
int total = 0;
for (int n : numbers) total += n;
return total;
}
public static void main(String[] args) {
System.out.println(sum());
System.out.println(sum(1, 2));
System.out.println(sum(1, 2, 3, 4, 5));
}
}
Keluaran:
0
3
15
Contoh 65: Pass by value
Primitif disalin; referensi objek juga disalin.
public class Ex065PassByValue {
static void change(int x, int[] arr) {
x = 99;
arr[0] = 99;
}
public static void main(String[] args) {
int n = 1;
int[] a = {1};
change(n, a);
System.out.println("n = " + n);
System.out.println("a[0] = " + a[0]);
}
}
Keluaran:
n = 1
a[0] = 99
Topik 9: Class dan objek
Class adalah cetak biru, dan objek adalah satu instance yang dibuat darinya dengan datanya sendiri. Class mengelompokkan field dan method bersama-sama dan membentuk inti Java.
Field, konstruktor, dan method
Field menyimpan data, konstruktor mengatur nilai awal ketika new dipakai, dan method bekerja pada data objek. this merujuk ke objek saat ini. Jadikan field private dan tampilkan hanya yang dibutuhkan kode lain.
Anggota static dan instance
Field static dipakai bersama oleh setiap objek dari class itu, seperti sebuah penghitung. Method instance membutuhkan objek untuk berjalan. Method static dipanggil melalui nama class, seperti Util.max(a, b).
Pewarisan dan polimorfisme
extends membuat subclass yang mewarisi field dan method serta bisa memanggil super(...). Override mengganti method induk dengan perilaku baru. Variabel bertipe induk menjalankan versi subclass saat runtime.
Class abstrak, interface, dan komposisi
Class abstrak tidak bisa langsung dibuat dan bisa berisi method yang belum selesai. Interface mendaftar method yang harus disediakan sebuah class, dan sejak Java 8 sebuah method default bisa memberikan badan bersama. Komposisi menempatkan satu objek di dalam objek lain, yang sering lebih fleksibel daripada pewarisan.
Class bersarang, inner class, dan enum
Class bersarang static tidak membutuhkan objek luar. Inner class bisa memakai field dari objek luarnya. Enum adalah kumpulan konstanta yang tetap, dan setiap konstanta bisa membawa field dan method sendiri.
equals dan hashCode
Objek yang disimpan dalam HashSet atau dipakai sebagai kunci HashMap perlu equals dan hashCode yang ditulis bersama. Objek yang sama harus menghasilkan kode hash yang sama, jika tidak pencarian akan gagal.
Contoh 66: Anggota static
Field dan method yang dipakai bersama oleh seluruh class.
public class Ex066StaticMembers {
static int counter = 0;
static void increment() {
counter++;
}
public static void main(String[] args) {
increment();
increment();
System.out.println("counter = " + counter);
}
}
Keluaran:
counter = 2
Contoh 67: Class dan objek
Definisikan class Book dan buat objek darinya.
public class Ex067ClassAndObject {
static class Book {
String title;
int pages;
Book(String title, int pages) {
this.title = title;
this.pages = pages;
}
}
public static void main(String[] args) {
Book b = new Book("Java Basics", 320);
System.out.println(b.title + " has " + b.pages + " pages");
}
}
Keluaran:
Java Basics has 320 pages
Contoh 68: Method instance
Method yang bekerja pada data milik satu objek.
public class Ex068InstanceMethods {
static class Counter {
private int value;
void add(int n) {
this.value += n;
}
int get() {
return value;
}
}
public static void main(String[] args) {
Counter c = new Counter();
c.add(3);
c.add(4);
System.out.println("value = " + c.get());
}
}
Keluaran:
value = 7
Contoh 69: Getter dan setter
Atur akses dan periksa input.
public class Ex069GettersSetters {
static class Person {
private String name;
public String getName() { return name; }
public void setName(String name) {
if (name == null || name.isBlank()) {
throw new IllegalArgumentException("name required");
}
this.name = name;
}
}
public static void main(String[] args) {
Person p = new Person();
p.setName("Nok");
System.out.println("name = " + p.getName());
}
}
Keluaran:
name = Nok
Contoh 70: toString
Cetak objek dengan cara yang mudah dibaca.
public class Ex070ToStringOverride {
static class Point {
final int x, y;
Point(int x, int y) { this.x = x; this.y = y; }
@Override
public String toString() {
return "Point(" + x + ", " + y + ")";
}
}
public static void main(String[] args) {
System.out.println(new Point(3, 4));
}
}
Keluaran:
Point(3, 4)
Contoh 71: Pewarisan
Sebuah class memperluas class lain dan memanggil super.
public class Ex071Inheritance {
static class Animal {
void speak() { System.out.println("...some sound"); }
}
static class Dog extends Animal {
@Override
void speak() {
super.speak();
System.out.println("Woof!");
}
}
public static void main(String[] args) {
new Dog().speak();
}
}
Keluaran:
...some sound
Woof!
Contoh 72: Polimorfisme
Panggil method yang tepat untuk setiap jenis objek.
public class Ex072Polymorphism {
static class Shape {
double area() { return 0; }
}
static class Square extends Shape {
double side = 3;
@Override double area() { return side * side; }
}
static class Circle extends Shape {
double r = 1;
@Override double area() { return Math.PI * r * r; }
}
public static void main(String[] args) {
Shape[] shapes = {new Square(), new Circle()};
for (Shape s : shapes) {
System.out.printf("%s area %.2f%n", s.getClass().getSimpleName(), s.area());
}
}
}
Keluaran:
Square area 9.00
Circle area 3.14
Contoh 73: Class abstrak
Class yang tidak bisa langsung dibuat.
public class Ex073AbstractClass {
static abstract class Vehicle {
abstract int wheels();
String describe() { return "wheels: " + wheels(); }
}
static class Bike extends Vehicle {
@Override int wheels() { return 2; }
}
public static void main(String[] args) {
System.out.println(new Bike().describe());
}
}
Keluaran:
wheels: 2
Contoh 74: Interface
Definisikan kontrak yang diimplementasikan sebuah class.
public class Ex074Interface {
interface Greeter {
String greet(String name);
}
static class English implements Greeter {
public String greet(String name) { return "Hello, " + name; }
}
public static void main(String[] args) {
Greeter g = new English();
System.out.println(g.greet("Lek"));
}
}
Keluaran:
Hello, Lek
Contoh 75: Method default
Method interface yang memiliki badan default.
public class Ex075DefaultMethod {
interface Logger {
void log(String msg);
default void logTwice(String msg) {
log(msg);
log(msg);
}
}
public static void main(String[] args) {
Logger console = msg -> System.out.println("LOG: " + msg);
console.logTwice("ready");
}
}
Keluaran:
LOG: ready
LOG: ready
Contoh 76: Komposisi
Sebuah class memuat objek lain sebagai salah satu field-nya.
public class Ex076Composition {
static class Engine {
String start() { return "engine started"; }
}
static class Car {
private final Engine engine = new Engine();
String drive() { return engine.start() + ", car moving"; }
}
public static void main(String[] args) {
System.out.println(new Car().drive());
}
}
Keluaran:
engine started, car moving
Contoh 77: Class bersarang static
Class yang diletakkan di dalam class lain.
public class Ex077StaticNestedClass {
static class Util {
static int square(int x) { return x * x; }
}
public static void main(String[] args) {
System.out.println("square(6) = " + Util.square(6));
}
}
Keluaran:
square(6) = 36
Contoh 78: Inner class
Inner class bisa mengakses field dari objek luarnya.
public class Ex078InnerClass {
private int base = 10;
class Adder {
int add(int n) { return base + n; }
}
public static void main(String[] args) {
Ex078InnerClass outer = new Ex078InnerClass();
Ex078InnerClass.Adder adder = outer.new Adder();
System.out.println("10 + 5 = " + adder.add(5));
}
}
Keluaran:
10 + 5 = 15
Contoh 79: Enum dengan field
Enum bisa menyimpan nilai dan method.
public class Ex079EnumWithFields {
enum Size {
SMALL(1), MEDIUM(2), LARGE(3);
private final int code;
Size(int code) { this.code = code; }
int code() { return code; }
}
public static void main(String[] args) {
for (Size s : Size.values()) {
System.out.println(s + " code " + s.code());
}
}
}
Keluaran:
SMALL code 1
MEDIUM code 2
LARGE code 3
Contoh 80: equals dan hashCode
Tentukan kesamaan untuk objek yang dipakai dalam koleksi.
import java.util.Objects;
public class Ex080EqualsHashCode {
static class Item {
final String id;
Item(String id) { this.id = id; }
@Override
public boolean equals(Object o) {
if (!(o instanceof Item)) return false;
return Objects.equals(id, ((Item) o).id);
}
@Override
public int hashCode() { return Objects.hash(id); }
}
public static void main(String[] args) {
System.out.println(new Item("A1").equals(new Item("A1")));
System.out.println(new Item("A1").hashCode() == new Item("A1").hashCode());
}
}
Keluaran:
true
true
Topik 10: Koleksi
Koleksi menyimpan kelompok objek. Pilih tipenya sesuai kebutuhan: daftar terurut, pencarian berdasarkan kunci, nilai yang unik, atau urutan first-in, first-out.
List, set, dan map
ArrayList menjaga urutan penyisipan dan mengizinkan duplikat. HashSet menyimpan nilai yang unik tanpa urutan yang pasti. HashMap menyimpan pasangan kunci-nilai. Masing-masing memiliki kecepatan berbeda untuk menambah dan mencari item.
Menelusuri map
entrySet memberi kunci dan nilai sekaligus dalam satu perulangan. HashMap tidak memiliki urutan yang pasti, jadi gunakan LinkedHashMap untuk menjaga urutan penyisipan atau TreeMap untuk menjaga kunci tetap terurut.
Antrean dan tumpukan dengan Deque
ArrayDeque bisa dipakai sebagai antrean (offer dan poll memberi urutan first-in, first-out) atau sebagai tumpukan (push dan pop memberi urutan last-in, first-out). Lebih baik memakainya daripada class Stack yang lama.
Pengurutan dengan Comparator
Comparator.comparingInt(Student::score).reversed() mengurutkan siswa berdasarkan nilai dari yang tertinggi ke yang terendah. Pengurutan mengubah list di tempatnya, jadi salin list terlebih dahulu jika Anda membutuhkan urutan aslinya.
Contoh 81: ArrayList
List yang bisa berubah ukuran dengan add, get, dan remove.
import java.util.ArrayList;
import java.util.List;
public class Ex081ArrayList {
public static void main(String[] args) {
List<String> names = new ArrayList<>();
names.add("Ann");
names.add("Ben");
names.add("Cat");
System.out.println("size = " + names.size());
System.out.println("get(1) = " + names.get(1));
names.remove("Ben");
System.out.println(names);
}
}
Keluaran:
size = 3
get(1) = Ben
[Ann, Cat]
Contoh 82: HashMap
Simpan pasangan kunci-nilai dan cari kembali.
import java.util.HashMap;
import java.util.Map;
public class Ex082HashMap {
public static void main(String[] args) {
Map<String, Integer> stock = new HashMap<>();
stock.put("pen", 10);
stock.put("pencil", 4);
System.out.println("pen: " + stock.get("pen"));
System.out.println("eraser: " + stock.getOrDefault("eraser", 0));
}
}
Keluaran:
pen: 10
eraser: 0
Contoh 83: HashSet
Koleksi yang tidak menyimpan duplikat.
import java.util.HashSet;
import java.util.Set;
public class Ex083HashSet {
public static void main(String[] args) {
Set<Integer> ids = new HashSet<>();
ids.add(1);
ids.add(2);
ids.add(1);
System.out.println("unique count = " + ids.size());
System.out.println("contains 2? " + ids.contains(2));
}
}
Keluaran:
unique count = 2
contains 2? true
Contoh 84: Menelusuri map
Telusuri entri dengan entrySet.
import java.util.Map;
import java.util.TreeMap;
public class Ex084MapEntries {
public static void main(String[] args) {
Map<String, Integer> ages = new TreeMap<>();
ages.put("Mali", 22);
ages.put("Dao", 30);
for (Map.Entry<String, Integer> e : ages.entrySet()) {
System.out.println(e.getKey() + " -> " + e.getValue());
}
}
}
Keluaran:
Dao -> 30
Mali -> 22
Contoh 85: Antrean dengan ArrayDeque
First in, first out dengan offer dan poll.
import java.util.ArrayDeque;
import java.util.Deque;
public class Ex085Deque {
public static void main(String[] args) {
Deque<String> queue = new ArrayDeque<>();
queue.offer("first");
queue.offer("second");
System.out.println("poll: " + queue.poll());
System.out.println("left: " + queue);
}
}
Keluaran:
poll: first
left: [second]
Contoh 86: Tumpukan dengan Deque
Last in, first out dengan push dan pop.
import java.util.ArrayDeque;
import java.util.Deque;
public class Ex086StackDeque {
public static void main(String[] args) {
Deque<Integer> stack = new ArrayDeque<>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println("pop: " + stack.pop());
System.out.println("peek: " + stack.peek());
}
}
Keluaran:
pop: 3
peek: 2
Contoh 87: Pengurutan dengan Comparator
Urutkan record berdasarkan sebuah field, dalam urutan terbalik.
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class Ex087ComparatorSort {
record Student(String name, int score) {}
public static void main(String[] args) {
List<Student> list = new ArrayList<>(List.of(
new Student("Ann", 70),
new Student("Ben", 92),
new Student("Cat", 85)));
list.sort(Comparator.comparingInt(Student::score).reversed());
for (Student s : list) {
System.out.println(s.name() + " " + s.score());
}
}
}
Keluaran:
Ben 92
Cat 85
Ann 70
Topik 11: Generics
Generics memungkinkan satu class atau method bekerja dengan banyak tipe, sementara kompiler tetap memeriksa bahwa tipenya cocok.
Class generik
class Box<T> menyimpan satu nilai dari tipe T apa pun. Kompiler mencegah Anda memasukkan String ke dalam Box<Integer>, sehingga kesalahannya ditemukan sebelum program berjalan.
Method generik
<T> T first(T[] items) bekerja pada array dengan tipe apa pun. Kompiler menyimpulkan T dari argumen yang Anda berikan.
Tipe terbatas
<T extends Comparable<T>> menyatakan bahwa T harus menyediakan compareTo, sehingga method bisa membandingkan nilai. Tanpa batasan ini, kompiler tidak bisa tahu bahwa method itu ada.
Contoh 88: Class generik
Class yang bekerja dengan tipe T apa pun.
public class Ex088GenericBox {
static class Box<T> {
private T item;
void put(T item) { this.item = item; }
T get() { return item; }
}
public static void main(String[] args) {
Box<String> b = new Box<>();
b.put("gift");
System.out.println("box has " + b.get());
Box<Integer> n = new Box<>();
n.put(42);
System.out.println("number " + (n.get() + 1));
}
}
Keluaran:
box has gift
number 43
Contoh 89: Method generik
Method yang bekerja pada array dengan tipe apa pun.
public class Ex089GenericMethod {
static <T> void printAll(T[] items) {
for (T item : items) {
System.out.println("item: " + item);
}
}
public static void main(String[] args) {
printAll(new String[]{"a", "b"});
printAll(new Integer[]{1, 2, 3});
}
}
Keluaran:
item: a
item: b
item: 1
item: 2
item: 3
Contoh 90: Generik terbatas
Gunakan Comparable untuk mencari nilai yang lebih besar dari dua nilai.
public class Ex090BoundedGeneric {
static <T extends Comparable<T>> T maxOf(T a, T b) {
return a.compareTo(b) >= 0 ? a : b;
}
public static void main(String[] args) {
System.out.println("max of 3 and 9 = " + maxOf(3, 9));
System.out.println("max of pear and apple = " + maxOf("pear", "apple"));
}
}
Keluaran:
max of 3 and 9 = 9
max of pear and apple = pear
Topik 12: Exception dan resource
Exception adalah error yang menginterupsi alur normal. try dan catch menanganinya, finally selalu dijalankan, dan try-with-resources menutup berkas serta resource lain secara otomatis.
try, catch, dan finally
Letakkan kode yang berisiko di dalam try. Tangkap tipe exception yang spesifik lebih dulu, lalu yang umum setelahnya. finally berjalan setelah blok try, baik terjadi error atau tidak, sehingga cocok untuk pembersihan.
Exception kustom dan throw
Perluas Exception untuk masalah yang harus ditangani pemanggil, atau RuntimeException untuk error pemrograman. throw mengirim objek exception ke atas tumpukan pemanggilan sampai ditemukan catch yang cocok.
try-with-resources dan multi-catch
Objek apa pun yang mengimplementasikan AutoCloseable ditutup secara otomatis ketika blok try berakhir. catch (A | B e) menangani dua tipe exception dalam satu klausa.
Contoh 91: try dan catch
Tangani error pembagian dengan nol.
public class Ex091TryCatch {
public static void main(String[] args) {
try {
int result = 10 / 0;
System.out.println("result = " + result);
} catch (ArithmeticException e) {
System.out.println("Caught: " + e.getMessage());
}
System.out.println("program continues");
}
}
Keluaran:
Caught: / by zero
program continues
Contoh 92: finally
Kode di finally berjalan baik terjadi error atau tidak.
public class Ex092Finally {
public static void main(String[] args) {
try {
System.out.println("in try");
throw new RuntimeException("oops");
} catch (RuntimeException e) {
System.out.println("in catch: " + e.getMessage());
} finally {
System.out.println("in finally, always runs");
}
}
}
Keluaran:
in try
in catch: oops
in finally, always runs
Contoh 93: Exception kustom
Buat class exception Anda sendiri.
public class Ex093CustomException {
static class InsufficientFundsException extends Exception {
InsufficientFundsException(String msg) { super(msg); }
}
static void withdraw(int balance, int amount) throws InsufficientFundsException {
if (amount > balance) {
throw new InsufficientFundsException("need " + (amount - balance) + " more");
}
System.out.println("withdrew " + amount);
}
public static void main(String[] args) {
try {
withdraw(100, 150);
} catch (InsufficientFundsException e) {
System.out.println("Error: " + e.getMessage());
}
}
}
Keluaran:
Error: need 50 more
Contoh 94: try-with-resources
Resource ditutup otomatis ketika blok berakhir.
public class Ex094TryWithResources {
static class Resource implements AutoCloseable {
Resource() { System.out.println("open"); }
void use() { System.out.println("use"); }
@Override public void close() { System.out.println("close"); }
}
public static void main(String[] args) {
try (Resource r = new Resource()) {
r.use();
}
}
}
Keluaran:
open
use
close
Contoh 95: Multi-catch
Tangani dua tipe exception dalam satu blok catch.
public class Ex095MultiCatch {
public static void main(String[] args) {
String[] inputs = {"12", "abc", null};
for (String s : inputs) {
try {
System.out.println(Integer.parseInt(s) * 2);
} catch (NumberFormatException | NullPointerException e) {
System.out.println("bad input: " + s);
}
}
}
}
Keluaran:
24
bad input: abc
bad input: null
Contoh 96: throw
Lempar exception ketika input tidak valid.
public class Ex096ThrowsAndThrow {
static int divide(int a, int b) {
if (b == 0) {
throw new IllegalArgumentException("divisor must not be zero");
}
return a / b;
}
public static void main(String[] args) {
System.out.println(divide(10, 2));
try {
divide(1, 0);
} catch (IllegalArgumentException e) {
System.out.println(e.getMessage());
}
}
}
Keluaran:
5
divisor must not be zero
Topik 13: Lambda, stream, dan record
Java modern menulis fungsi kecil dan pipeline data dalam bentuk yang singkat. Record mendeskripsikan class data biasa dalam satu baris.
Ekspresi lambda
(a, b) -> a + b adalah fungsi yang bisa Anda teruskan sebagai nilai. Lambda bekerja dengan interface yang hanya memiliki satu method abstrak, seperti Runnable atau Comparator.
Stream
Stream mengalirkan item melalui langkah-langkah: filter menyimpan yang cocok, map mengubah setiap item, dan collect mengumpulkan hasilnya. Stream tidak melakukan apa pun sampai langkah terminal seperti collect, sum, atau findFirst dijalankan.
Record dan Optional
record Student(String name, int score) membuat class dengan constructor, getter, equals, hashCode, dan toString. Optional membungkus nilai yang mungkin tidak ada, yang mengurangi pemeriksaan null yang tersebar.
Contoh 97: Ekspresi lambda
Fungsi pendek yang diteruskan sebagai nilai.
import java.util.function.Function;
public class Ex097Lambda {
public static void main(String[] args) {
Function<Integer, Integer> doubler = x -> x * 2;
System.out.println("double 7 = " + doubler.apply(7));
Runnable hello = () -> System.out.println("hello from lambda");
hello.run();
}
}
Keluaran:
double 7 = 14
hello from lambda
Contoh 98: Stream: filter dan map
Saring dan ubah sebuah list dalam pipeline.
import java.util.List;
public class Ex098StreamFilterMap {
public static void main(String[] args) {
List<Integer> nums = List.of(1, 2, 3, 4, 5, 6);
List<Integer> result = nums.stream()
.filter(n -> n % 2 == 0)
.map(n -> n * n)
.toList();
System.out.println(result);
}
}
Keluaran:
[4, 16, 36]
Contoh 99: Record
Class pendek untuk data, dengan method yang sudah ditulis untuk Anda.
public class Ex099RecordType {
record Point(int x, int y) {
int distanceSquared() { return x * x + y * y; }
}
public static void main(String[] args) {
Point p = new Point(3, 4);
System.out.println(p);
System.out.println("x = " + p.x() + ", distance^2 = " + p.distanceSquared());
}
}
Keluaran:
Point[x=3, y=4]
x = 3, distance^2 = 25
Contoh 100: Stream dan Optional
Jumlahkan panjang dan cari kata terpanjang dengan aman.
import java.util.List;
import java.util.Optional;
public class Ex100StreamCollect {
public static void main(String[] args) {
List<String> words = List.of("java", "stream", "lambda");
int totalLength = words.stream().mapToInt(String::length).sum();
System.out.println("total length = " + totalLength);
Optional<String> longest = words.stream().max((a, b) -> a.length() - b.length());
System.out.println("longest = " + longest.orElse("none"));
}
}
Keluaran:
total length = 16
longest = stream
Proyek latihan: Laporan nilai
Gabungkan gagasan menjadi satu program. Tulis sendiri terlebih dahulu, lalu bandingkan hasilnya dengan contohnya. Setiap langkah berisi pekerjaan sekitar satu atau dua contoh.
1. Buat record Student dengan nama dan nilai, lalu buat list berisi lima siswa.
2. Gunakan stream untuk menyimpan siswa yang nilainya 50 atau lebih, diurutkan dari yang tertinggi ke yang terendah.
3. Cetak setiap siswa yang lulus dengan String.format, memberi nama lebar tetap dan nilai dua digit.
4. Simpan setiap nilai huruf dalam Map<String, String>, memakai ekspresi switch: A untuk 80 atau lebih, B untuk 70 atau lebih, C untuk 50 atau lebih, dan F untuk yang lebih rendah.
5. Jelaskan dalam komentar mengapa Anda memilih List, Set, atau Map untuk setiap bagian program.
Langkah berikutnya
Berikutnya, pelajari alat build seperti Maven atau Gradle, tulis pengujian unit dengan JUnit, dan bangun program konsol kecil yang membaca berkas teks. Keluaran yang ditampilkan untuk setiap contoh diambil dari proses yang benar-benar dijalankan di JDK 17, jadi jika keluaran Anda berbeda, periksa versi Java Anda terlebih dahulu.
Ringkasan
Program Java dibangun dari class dan method. Melalui 100 contoh yang sudah dikompilasi, artikel ini membahas variabel, operator, keputusan, perulangan, array, string, method, class, koleksi, generics, exception, lambda, stream, dan record. Setiap contoh menampilkan kode lengkap dan keluaran sebenarnya. Cara terbaik untuk berlatih adalah mengubah sebuah nilai, memprediksi hasilnya, lalu menjalankan program untuk memeriksanya.