Menguasai Perbandingan String di Java: Perbedaan Antara “==”, equals(), compareTo(), dan Praktik Terbaik

1. Pendahuluan

Mengapa perbandingan string penting dalam Java?

Dalam pemrograman Java, string digunakan dalam banyak situasi. Memeriksa nama pengguna, memvalidasi input formulir, dan memverifikasi respons API semuanya memerlukan perbandingan string. Pada titik ini, “cara membandingkan string dengan benar” merupakan hambatan umum bagi pemula. Khususnya, kegagalan memahami perbedaan antara operator == dan metode equals() dapat menyebabkan bug yang tidak terduga.

Bahaya tidak memahami perbedaan antara “==” dan “equals”

Pertimbangkan kode berikut:

String a = "apple";
String b = new String("apple");

System.out.println(a == b);       // result: false
System.out.println(a.equals(b));  // result: true

Banyak orang terkejut dengan output ini. Meskipun stringnya identik, == mengembalikan false sementara equals() mengembalikan true. Hal ini terjadi karena Java memperlakukan string sebagai tipe referensi, dan == membandingkan alamat referensi. Memahami cara yang benar untuk membandingkan string secara langsung memengaruhi keandalan dan keterbacaan program Anda. Jika Anda memahaminya dengan baik, Anda dapat mencegah bug sebelum terjadi.

Apa yang akan Anda pelajari dalam artikel ini

Artikel ini menjelaskan perbandingan string Java dari dasar hingga aplikasi praktis. Artikel ini menjawab pertanyaan seperti:

  • Apa perbedaan antara == dan equals() ?
  • Bagaimana cara membandingkan string sambil mengabaikan huruf besar/kecil?
  • Bagaimana cara membandingkan string secara leksikografis?
  • Bagaimana menghindari pengecualian saat membandingkan dengan null?

Melalui contoh dunia nyata, Anda akan memperoleh pemahaman yang kuat tentang praktik perbandingan string yang benar.

2. Dasar-dasar String di Java

String adalah tipe referensi

Dalam Java, tipe String bukan tipe primitif (seperti int atau boolean) melainkan tipe referensi. Variabel String tidak menyimpan karakter sebenarnya melainkan referensi ke objek yang disimpan di memori heap. Misalnya:

String a = "hello";
String b = "hello";

Baik a maupun b dapat merujuk ke literal "hello" yang sama karena mekanisme interning string Java.

Perbedaan antara literal string dan new String()

Java mengoptimalkan literal string yang berulang dengan menggunakan kembali referensi yang sama:

String s1 = "apple";
String s2 = "apple";
System.out.println(s1 == s2); // true (same literal, interned)

Namun, penggunaan new selalu membuat objek baru:

String s3 = new String("apple");
System.out.println(s1 == s3); // false (different references)
System.out.println(s1.equals(s3)); // true (same content)

Dengan demikian, == memeriksa referensi dan equals() memeriksa konten.

String bersifat immutable

Fitur penting lainnya adalah bahwa String bersifat immutable. Setelah dibuat, sebuah string tidak dapat diubah.

String original = "hello";
original = original + " world";

Ini membuat objek String baru alih-alih memodifikasi yang asli.

3. Metode untuk Membandingkan String

Membandingkan referensi dengan ==

== membandingkan referensi objek:

String a = "Java";
String b = new String("Java");

System.out.println(a == b); // false

Ini tidak boleh digunakan untuk perbandingan konten.

Membandingkan konten dengan equals()

equals() adalah cara yang tepat untuk membandingkan konten string:

String a = "Java";
String b = new String("Java");

System.out.println(a.equals(b)); // true

Menghindari NullPointerException

String input = null;
System.out.println(input.equals("test")); // Exception!

Gunakan gaya constant-first:

System.out.println("test".equals(input)); // false, safe

Mengabaikan huruf besar/kecil dengan equalsIgnoreCase()

String a = "Hello";
String b = "hello";

System.out.println(a.equalsIgnoreCase(b)); // true

Perbandingan leksikografis dengan compareTo()

  • 0 → sama
  • Negatif → pemanggil mendahului
  • Positif → pemanggil mengikuti
    String a = "apple";
    String b = "banana";
    
    System.out.println(a.compareTo(b)); // negative
    

4. Contoh Praktis

Memeriksa login pengguna

String inputUsername = "Naohiro";
String registeredUsername = "naohiro";

if (registeredUsername.equalsIgnoreCase(inputUsername)) {
    System.out.println("Login successful");
} else {
    System.out.println("Username does not match");
}

Password harus selalu menggunakan equals() karena sensitivitas huruf diperlukan.

Validasi input formulir

String selectedOption = request.getParameter("plan");

if ("premium".equals(selectedOption)) {
    System.out.println("Premium plan selected.");
} else {
    System.out.println("Other plan selected.");
}

Logika percabangan dengan beberapa pemeriksaan string

String cmd = args[0];

if ("start".equals(cmd)) {
    startApp();
} else if ("stop".equals(cmd)) {
    stopApp();
} else {
    System.out.println("Invalid command");
}
switch (cmd) {
    case "start":
        startApp();
        break;
    case "stop":
        stopApp();
        break;
    default:
        System.out.println("Unknown command");
}

Menangani null dengan aman

String keyword = null;

if ("search".equals(keyword)) {
    System.out.println("Searching...");
}

5. Kinerja dan Optimisasi

Biaya perbandingan string

equals() dan compareTo() membandingkan karakter secara internal. Untuk string yang panjang atau perbandingan yang berulang, hal ini dapat memengaruhi kinerja.

Menggunakan String.intern() untuk kinerja

String a = new String("hello").intern();
String b = "hello";

System.out.println(a == b); // true

Gunakan hanya bila diperlukan untuk menghindari tekanan memori.

Dampak kinerja dari equalsIgnoreCase()

String input = userInput.toLowerCase();
if ("admin".equals(input)) {
    // fast comparison
}

Menggunakan StringBuilder / StringBuffer

StringBuilder sb = new StringBuilder();
sb.append("user_");
sb.append("123");

String result = sb.toString();

if (result.equals("user_123")) {
    // comparison
}

Menggunakan caching atau peta untuk mengurangi perbandingan

Map<String, Runnable> commandMap = new HashMap<>();
commandMap.put("start", () -> startApp());
commandMap.put("stop", () -> stopApp());

Runnable action = commandMap.get(inputCommand);
if (action != null) {
    action.run();
}

6. FAQ

Q1. Apa perbedaan antara == dan equals()?

A.

  • == membandingkan referensi
  • equals() membandingkan isi string

Q2. Mengapa equals() menghasilkan error ketika variabel bernilai null?

String input = null;
input.equals("test"); // Exception

Gunakan perbandingan dengan konstanta di depan:

"test".equals(input);

Q3. Bagaimana cara membandingkan string tanpa memperhatikan huruf besar/kecil?

stringA.equalsIgnoreCase(stringB);

Q4. Bagaimana cara membandingkan urutan alfabet?

a.compareTo(b);

7. Kesimpulan

Memilih metode perbandingan yang tepat dengan benar sangat penting

Karena String adalah tipe referensi, perbandingan yang salah sering menyebabkan perilaku yang tidak terduga. Memahami perbedaan antara == dan equals() sangat penting.

Daftar Periksa

  • == : membandingkan referensi
  • equals() : membandingkan isi
  • equalsIgnoreCase() : mengabaikan huruf besar/kecil
  • compareTo() : urutan kamus
  • "constant".equals(variable) : aman terhadap null
  • Gunakan intern() atau caching untuk perbandingan berat

Pengetahuan praktis dan penting

Perbandingan string muncul dalam pemeriksaan login, validasi, operasi basis data, logika percabangan, dan banyak tugas harian. Mengetahui teknik yang benar membantu menulis kode yang lebih aman dan dapat diandalkan. Gunakan panduan ini sebagai referensi saat bekerja dengan string di Java.