Membandingkan String di Java

1. Ikhtisar

Pada artikel ini, kita akan membahas tentang berbagai cara membandingkan String di Java.

Karena String adalah salah satu tipe data yang paling banyak digunakan di Java, ini tentu saja merupakan operasi yang sangat umum digunakan.

2. String Perbandingan Dengan String Kelas

2.1. Menggunakan Operator Perbandingan “==”

Menggunakan operator “==” untuk membandingkan nilai teks adalah salah satu kesalahan paling umum yang dilakukan pemula Java. Ini tidak benar karena "==" hanya memeriksa persamaan referensial dari dua String , yang berarti jika keduanya mereferensikan objek yang sama atau tidak.

Mari kita lihat contoh perilaku ini:

String string1 = "using comparison operator"; String string2 = "using comparison operator"; String string3 = new String("using comparison operator"); assertThat(string1 == string2).isTrue(); assertThat(string1 == string3).isFalse();

Dalam contoh di atas, pernyataan pertama adalah benar karena kedua variabel menunjuk ke literal String yang sama .

Di sisi lain, pernyataan kedua salah karena string1 dibuat dengan literal dan string3 dibuat menggunakan operator baru - oleh karena itu mereka mereferensikan objek yang berbeda.

2.2. Menggunakan sama dengan ()

Kelas String menggantikan equals () yang diwarisi dari Object. Metode ini membandingkan dua karakter String dengan karakter, mengabaikan alamatnya.

Itu menganggap mereka sama jika mereka memiliki panjang yang sama dan karakter dalam urutan yang sama:

String string1 = "using equals method"; String string2 = "using equals method"; String string3 = "using EQUALS method"; String string4 = new String("using equals method"); assertThat(string1.equals(string2)).isTrue(); assertThat(string1.equals(string4)).isTrue(); assertThat(string1.equals(null)).isFalse(); assertThat(string1.equals(string3)).isFalse();

Dalam contoh ini, variabel string1, string2, dan string4 sama karena keduanya memiliki kapitalisasi dan nilai yang sama terlepas dari alamatnya.

Untuk string3 , metode ini mengembalikan false, karena peka huruf besar / kecil.

Selain itu, jika salah satu dari dua string bernilai null , maka metode tersebut akan menampilkan false.

2.3. Menggunakan equalsIgnoreCase ()

Metode equalsIgnoreCase () mengembalikan nilai boolean. Seperti namanya, metode ini mengabaikan casing dalam karakter sambil membandingkan String :

String string1 = "using equals ignore case"; String string2 = "USING EQUALS IGNORE CASE"; assertThat(string1.equalsIgnoreCase(string2)).isTrue();

2.4. Menggunakan bandingkanTo ()

Metode bandingkanTo () mengembalikan nilai tipe int dan membandingkan dua karakter String dengan karakter secara leksikografis berdasarkan kamus atau pengurutan alami.

Metode ini mengembalikan 0 jika dua String sama atau jika keduanya nol, angka negatif jika String pertama muncul sebelum argumen, dan angka yang lebih besar dari nol jika String pertama muncul setelah argumen String.

Mari kita lihat contohnya:

String author = "author"; String book = "book"; String duplicateBook = "book"; assertThat(author.compareTo(book)) .isEqualTo(-1); assertThat(book.compareTo(author)) .isEqualTo(1); assertThat(duplicateBook.compareTo(book)) .isEqualTo(0);

2.5. Menggunakan bandingkanToIgnoreCase ()

The compareToIgnoreCase () mirip dengan metode sebelumnya, kecuali mengabaikan kasus:

String author = "Author"; String book = "book"; String duplicateBook = "BOOK"; assertThat(author.compareToIgnoreCase(book)) .isEqualTo(-1); assertThat(book.compareToIgnoreCase(author)) .isEqualTo(1); assertThat(duplicateBook.compareToIgnoreCase(book)) .isEqualTo(0);

3. Perbandingan String Dengan Kelas Objek

Objects adalah kelas utilitas yang berisi metode equals () statis , berguna dalam skenario ini - untuk membandingkan dua String.

Metode ini mengembalikan nilai true jika dua String sama dengan pertama membandingkannya menggunakan alamatnya yaitu " ==" . Akibatnya, jika kedua argumen adalah nol , ia mengembalikan benar dan jika tepat satu argumen adalah nol , ia mengembalikan palsu.

Jika tidak, maka cukup memanggil metode equals () dari kelas tipe argumen yang diteruskan - yang dalam kasus kami adalah metode kelas String equals () . Metode ini peka huruf besar / kecil karena secara internal memanggil metode equals () kelas String .

Mari kita uji ini:

String string1 = "using objects equals"; String string2 = "using objects equals"; String string3 = new String("using objects equals"); assertThat(Objects.equals(string1, string2)).isTrue(); assertThat(Objects.equals(string1, string3)).isTrue(); assertThat(Objects.equals(null, null)).isTrue(); assertThat(Objects.equals(null, string1)).isFalse();

4. Perbandingan String Dengan Apache Commons

Pustaka Apache Commons berisi kelas utilitas yang disebut StringUtils untuk operasi terkait String ; ini juga memiliki beberapa metode yang sangat bermanfaat untuk perbandingan String .

4.1. Menggunakan equals () dan equalsIgnoreCase ()

Metode equals () dari kelas StringUtils adalah versi yang disempurnakan dari metode kelas String equals (), yang juga menangani nilai null:

assertThat(StringUtils.equals(null, null)) .isTrue(); assertThat(StringUtils.equals(null, "equals method")) .isFalse(); assertThat(StringUtils.equals("equals method", "equals method")) .isTrue(); assertThat(StringUtils.equals("equals method", "EQUALS METHOD")) .isFalse();

Metode equalsIgnoreCase () dari StringUtils mengembalikan nilai boolean . Ini berfungsi mirip dengan equals (), kecuali ia mengabaikan karakter huruf besar dalam Strings:

assertThat(StringUtils.equalsIgnoreCase("equals method", "equals method")) .isTrue(); assertThat(StringUtils.equalsIgnoreCase("equals method", "EQUALS METHOD")) .isTrue();

4.2. Menggunakan equalsAny () dan equalsAnyIgnoreCase ()

The equalsAny () argumen pertama metode ini adalah String dan yang kedua adalah jenis multi-args CharSequence. Metode ini mengembalikan nilai true jika ada String lain yang diberikan cocok dengan huruf besar String pertama secara sensitif.

Jika tidak, salah dikembalikan:

assertThat(StringUtils.equalsAny(null, null, null)) .isTrue(); assertThat(StringUtils.equalsAny("equals any", "equals any", "any")) .isTrue(); assertThat(StringUtils.equalsAny("equals any", null, "equals any")) .isTrue(); assertThat(StringUtils.equalsAny(null, "equals", "any")) .isFalse(); assertThat(StringUtils.equalsAny("equals any", "EQUALS ANY", "ANY")) .isFalse();

Metode equalsAnyIgnoreCase () bekerja sama dengan metode equalsAny () , tetapi juga mengabaikan casing:

assertThat(StringUtils.equalsAnyIgnoreCase("ignore case", "IGNORE CASE", "any")).isTrue();

4.3. Menggunakan bandingkan () dan bandingkanIgnoreCase ()

The membandingkan () metode dalam StringUtils kelas adalah versi null-aman dari compareTo () metode String kelas dan menangani nol nilai dengan mempertimbangkan nol nilai kurang dari non-null nilai. Dua nilai nol dianggap sama.

Selanjutnya, metode ini dapat digunakan untuk mengurutkan daftar String dengan entri null :

assertThat(StringUtils.compare(null, null)) .isEqualTo(0); assertThat(StringUtils.compare(null, "abc")) .isEqualTo(-1); assertThat(StringUtils.compare("abc", "bbc")) .isEqualTo(-1); assertThat(StringUtils.compare("bbc", "abc")) .isEqualTo(1);

Metode bandingkanIgnoreCase () berperilaku serupa, kecuali metode ini mengabaikan casing:

assertThat(StringUtils.compareIgnoreCase("Abc", "bbc")) .isEqualTo(-1); assertThat(StringUtils.compareIgnoreCase("bbc", "ABC")) .isEqualTo(1); assertThat(StringUtils.compareIgnoreCase("abc", "ABC")) .isEqualTo(0);

Kedua metode ini juga dapat digunakan dengan opsi nullIsLess . Ini adalah argumen boolean ketiga yang memutuskan apakah nilai null harus dianggap kurang atau tidak .

Nilai null lebih rendah dari String lain jika nullIsLess benar dan lebih tinggi jika nullIsLess salah.

Mari kita coba:

assertThat(StringUtils.compare(null, "abc", true)) .isEqualTo(-1); assertThat(StringUtils.compare(null, "abc", false)) .isEqualTo(1);

Metode bandingkanIgnoreCase () dengan argumen boolean ketiga bekerja serupa, kecuali dengan mengabaikan case.

5. Kesimpulan

Dalam tutorial singkat ini, kami membahas berbagai cara membandingkan String.

Dan, seperti biasa, kode sumber untuk contoh dapat ditemukan di GitHub.