Program yang berguna hampir selalu mengambil keputusan: apakah nilai ujian cukup untuk lulus, apakah stok sudah habis, apakah dua data terasa sama. Keputusan seperti itu dimulai dari operator perbandingan — Java menyebutnya operator relasional dan kesetaraan — yang menghasilkan nilai boolean: true atau false. Ada enam operator utama yang kita bahas pada Chapter ini: <, >, <=, >=, ==, dan !=. Bagian terakhir membedah satu perbedaan fundamental yang wajib dipahami sejak dini: operator == pada tipe primitif membandingkan nilai, tetapi pada objek operator == membandingkan referensi.
Operator Relasional pada Nilai #
Lima operator pertama (<, >, <=, >=, !=) bersama == menerima dua operand numerik dan mengembalikan boolean. Berbeda dari operator aritmetika, hasilnya tidak pernah bertipe angka — nilai true dan false siap dipakai sebagai kondisi pada statement if atau loop. Tipe char juga dapat dibandingkan karena setiap karakter memiliki nilai numerik Unicode; huruf 'J' bernilai lebih kecil daripada 'Z'.
public class PerbandinganNilai {
public static void main(String[] args) {
int umurBudi = 17;
int umurSiti = 19;
System.out.println("umurBudi < umurSiti : " + (umurBudi < umurSiti));
System.out.println("umurBudi > umurSiti : " + (umurBudi > umurSiti));
System.out.println("umurBudi <= 17 : " + (umurBudi <= 17));
System.out.println("umurBudi >= 19 : " + (umurBudi >= 19));
System.out.println("umurBudi == umurSiti : " + (umurBudi == umurSiti));
System.out.println("umurBudi != umurSiti : " + (umurBudi != umurSiti));
char huruf = 'J';
System.out.println("huruf < 'Z' : " + (huruf < 'Z'));
}
}Output yang Dihasilkan:
umurBudi < umurSiti : true
umurBudi > umurSiti : false
umurBudi <= 17 : true
umurBudi >= 19 : false
umurBudi == umurSiti : false
umurBudi != umurSiti : true
huruf < 'Z' : trueBaris 6-11 membandingkan dua variabel int dengan keenam operator; perhatikan bahwa umurBudi <= 17 bernilai true karena syarat “kurang dari atau sama dengan” terpenuhi. Baris 13-14 membandingkan dua char melalui nilai numerik Unicode-nya. Tanda kurung pada setiap ekspresi diperlukan agar operator perbandingan dievaluasi lebih dahulu sebelum operator + menggabungkan hasilnya ke teks.
Membandingkan Referensi Objek #
Perilaku == berubah total ketika operandnya adalah objek seperti String. Operator == membandingkan referensi — apakah kedua variabel menunjuk objek yang sama di memori — bukan membandingkan isi objek. Dua literal "Bandung" dipetakan compiler ke satu objek bersama di string pool, sehingga perbandingan == menghasilkan true. Sebaliknya, new String("Bandung") selalu membuat objek baru di heap, sehingga == terhadap objek lain menghasilkan false meski isinya sama persis.
public class PerbandinganReferensi {
public static void main(String[] args) {
String kotaA = "Bandung";
String kotaB = "Bandung"; // literal sama: berbagi satu objek
String kotaC = new String("Bandung"); // objek baru di memori heap
System.out.println("kotaA == kotaB : " + (kotaA == kotaB));
System.out.println("kotaA == kotaC : " + (kotaA == kotaC));
System.out.println("kotaA.equals(kotaC) : " + (kotaA.equals(kotaC)));
System.out.println("kotaA.equals(\"Jakarta\") : " + (kotaA.equals("Jakarta")));
int angkaA = 100;
int angkaB = 100;
System.out.println("angkaA == angkaB : " + (angkaA == angkaB));
}
}Output yang Dihasilkan:
kotaA == kotaB : true
kotaA == kotaC : false
kotaA.equals(kotaC) : true
kotaA.equals("Jakarta") : false
angkaA == angkaB : trueMari kita telaah baris-baris kode di atas:
- Baris 3-5:
kotaAdankotaBmenunjuk objek yang sama di string pool, sedangkankotaCmenunjuk objek terpisah hasilnew String(...). - Baris 7-8:
kotaA == kotaBbernilaitruekarena referensinya sama;kotaA == kotaCbernilaifalsekarena referensinya berbeda walaupun teksnya identik. - Baris 9-10: method
equalsdari classStringmembandingkan isi karakter, sehinggakotaA.equals(kotaC)bernilaitruedankotaA.equals("Jakarta")bernilaifalse. - Baris 12-14: pada tipe primitif
int, operator==kembali membandingkan nilai sehinggaangkaA == angkaBbernilaitrue.
Aturan praktisnya mudah diingat: == untuk tipe primitif, equals untuk isi objek. Hasil boolean dari operator perbandingan inilah yang menjadi bahan baku pengambilan keputusan. Chapter berikutnya membahas logical operators — &&, ||, dan ! — yang menggabungkan beberapa kondisi boolean menjadi satu keputusan akhir.
Referensi #
- Java Language Specification — Bab 15 Expressions
- Class String — Java SE 25 API
- Oracle Dev.java — Learn Java
Berkas Sumber
Berkas pendukung halaman ini dapat diunduh dan dijalankan langsung sesuai penjelasan di atas.
PerbandinganNilai.java
Unduh berkaspublic class PerbandinganNilai {
public static void main(String[] args) {
int umurBudi = 17;
int umurSiti = 19;
System.out.println("umurBudi < umurSiti : " + (umurBudi < umurSiti));
System.out.println("umurBudi > umurSiti : " + (umurBudi > umurSiti));
System.out.println("umurBudi <= 17 : " + (umurBudi <= 17));
System.out.println("umurBudi >= 19 : " + (umurBudi >= 19));
System.out.println("umurBudi == umurSiti : " + (umurBudi == umurSiti));
System.out.println("umurBudi != umurSiti : " + (umurBudi != umurSiti));
char huruf = 'J';
System.out.println("huruf < 'Z' : " + (huruf < 'Z'));
}
}
PerbandinganReferensi.java
Unduh berkaspublic class PerbandinganReferensi {
public static void main(String[] args) {
String kotaA = "Bandung";
String kotaB = "Bandung"; // literal sama: berbagi satu objek
String kotaC = new String("Bandung"); // objek baru di memori heap
System.out.println("kotaA == kotaB : " + (kotaA == kotaB));
System.out.println("kotaA == kotaC : " + (kotaA == kotaC));
System.out.println("kotaA.equals(kotaC) : " + (kotaA.equals(kotaC)));
System.out.println("kotaA.equals(\"Jakarta\") : " + (kotaA.equals("Jakarta")));
int angkaA = 100;
int angkaB = 100;
System.out.println("angkaA == angkaB : " + (angkaA == angkaB));
}
}