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:

text
umurBudi <  umurSiti : true
umurBudi >  umurSiti : false
umurBudi <= 17       : true
umurBudi >= 19       : false
umurBudi == umurSiti : false
umurBudi != umurSiti : true
huruf < 'Z'          : true

Baris 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:

text
kotaA == kotaB      : true
kotaA == kotaC      : false
kotaA.equals(kotaC) : true
kotaA.equals("Jakarta") : false
angkaA == angkaB    : true

Mari kita telaah baris-baris kode di atas:

  1. Baris 3-5: kotaA dan kotaB menunjuk objek yang sama di string pool, sedangkan kotaC menunjuk objek terpisah hasil new String(...).
  2. Baris 7-8: kotaA == kotaB bernilai true karena referensinya sama; kotaA == kotaC bernilai false karena referensinya berbeda walaupun teksnya identik.
  3. Baris 9-10: method equals dari class String membandingkan isi karakter, sehingga kotaA.equals(kotaC) bernilai true dan kotaA.equals("Jakarta") bernilai false.
  4. Baris 12-14: pada tipe primitif int, operator == kembali membandingkan nilai sehingga angkaA == angkaB bernilai true.

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 #

Berkas Sumber

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

PerbandinganNilai.java

Unduh berkas
java
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'));
    }
}

PerbandinganReferensi.java

Unduh berkas
java
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));
    }
}