1. Gambaran keseluruhan
Dalam artikel ini, kita akan membincangkan pelbagai cara membandingkan String di Java.
Oleh kerana String adalah salah satu jenis data yang paling banyak digunakan di Java, ini secara semula jadi merupakan operasi yang biasa digunakan.
2. String Perbandingan Dengan String Kelas
2.1. Menggunakan Pengendali Perbandingan “==”
Menggunakan operator "==" untuk membandingkan nilai teks adalah salah satu kesalahan yang paling biasa dilakukan oleh pemula Java. Ini tidak betul kerana “==” hanya memeriksa persamaan referensi dua String , yang bermaksud jika mereka merujuk objek yang sama atau tidak.
Mari lihat contoh tingkah laku 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, penegasan pertama adalah benar kerana kedua pemboleh ubah tersebut menunjuk pada String literal yang sama .
Sebaliknya, penegasan kedua adalah salah kerana string1 dibuat dengan literal dan string3 dibuat menggunakan operator baru - oleh itu mereka merujuk objek yang berbeza.
2.2. Menggunakan sama dengan ()
The String kelas mengatasi yang sama dengan () diwarisi daripada Objek. Kaedah ini membandingkan dua watak Strings dengan watak, mengabaikan alamatnya.
Ia menganggapnya sama jika panjangnya sama dan wataknya mengikut 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 kerana mereka mempunyai kes dan nilai yang sama tanpa mengira alamatnya.
Untuk string3 kaedah ini kembali palsu, kerana peka huruf besar kecil.
Juga, jika salah satu daripada dua rentetan itu batal , maka kaedah tersebut akan menjadi salah.
2.3. Menggunakan equalsIgnoreCase ()
Kaedah equalsIgnoreCase () mengembalikan nilai boolean. Seperti namanya kaedah ini mengabaikan casing dalam watak sambil membandingkan Strings :
String string1 = "using equals ignore case"; String string2 = "USING EQUALS IGNORE CASE"; assertThat(string1.equalsIgnoreCase(string2)).isTrue();
2.4. Menggunakan membandingkanTo ()
Kaedah membandingkanTo () mengembalikan nilai jenis int dan membandingkan dua watak Strings mengikut watak berdasarkan leksikografi berdasarkan kamus atau susunan semula jadi.
Kaedah ini mengembalikan 0 jika dua Strings adalah sama atau kedua-duanya jika null, nombor negatif jika yang pertama String datang sebelum hujah, dan yang lebih besar jumlah daripada sifar jika yang pertama String datang selepas hujah String.
Mari lihat contoh:
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 membandingkanToIgnoreCase ()
The membandingkanToIgnoreCase () serupa dengan kaedah sebelumnya, kecuali mengabaikan kes:
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 Rentetan Dengan Kelas Objek
Objek adalah kelas utiliti yang mengandungi kaedah sama dengan statik () , berguna dalam senario ini - untuk membandingkan dua String.
Kaedah pulangan benar jika dua Strings adalah sama dengan pertama membandingkan mereka menggunakan alamat mereka iaitu " ==" . Akibatnya, jika kedua-dua argumen itu tidak sah , ia akan menjadi benar dan jika betul satu argumen itu nol , ia akan menjadi salah.
Jika tidak, ia kemudian hanya memanggil sama dengan () kaedah kelas jenis hujah yang diluluskan itu - yang dalam kes ini adalah tali yang kelas sama () kaedah. Kaedah ini peka huruf besar kecil kerana secara dalaman memanggil kaedah kelas String sama () .
Mari 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 Rentetan Dengan Apache Commons
Perpustakaan Apache Commons mengandungi kelas utiliti dipanggil StringUtils untuk String- operasi yang berkaitan ; ini juga mempunyai beberapa kaedah yang sangat bermanfaat untuk perbandingan String .
4.1. Menggunakan sama () dan sama denganIgnoreCase ()
Yang sama dengan () kaedah StringUtils kelas adalah versi yang dipertingkatkan daripada String kaedah kelas sama dengan (), yang juga mengendalikan 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();
The equalsIgnoreCase () kaedah StringUtils mengembalikan boolean nilai. Ini berfungsi sama dengan sama dengan (), kecuali mengabaikan casing watak dalam Strings:
assertThat(StringUtils.equalsIgnoreCase("equals method", "equals method")) .isTrue(); assertThat(StringUtils.equalsIgnoreCase("equals method", "EQUALS METHOD")) .isTrue();
4.2. Menggunakan equalsAny () dan sama denganAnyIgnoreCase ()
The equalsAny () Hujah pertama method ialah String dan yang kedua adalah pelbagai jenis args CharSequence. Kaedah ini akan kembali benar jika ada Strings yang diberikan sesuai dengan kes String pertama dengan sensitif.
Jika tidak, palsu 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();
Kaedah equalsAnyIgnoreCase () berfungsi sama dengan kaedah equalsAny () , tetapi juga mengabaikan casing:
assertThat(StringUtils.equalsAnyIgnoreCase("ignore case", "IGNORE CASE", "any")).isTrue();
4.3. Menggunakan membandingkan () dan membandingkanIgnoreCase ()
Kaedah membandingkan () dalam kelas StringUtils adalah versi selamat dari nol kaedah perbandinganTT () kelas String dan menangani nilai nol dengan mempertimbangkan nilai nol kurang daripada nilai bukan nol . Dua nilai nol dianggap sama.
Selanjutnya, kaedah ini boleh digunakan untuk menyusun senarai 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);
Kaedah membandingkanIgnoreCase () berkelakuan serupa, kecuali mengabaikan casing:
assertThat(StringUtils.compareIgnoreCase("Abc", "bbc")) .isEqualTo(-1); assertThat(StringUtils.compareIgnoreCase("bbc", "ABC")) .isEqualTo(1); assertThat(StringUtils.compareIgnoreCase("abc", "ABC")) .isEqualTo(0);
Kedua-dua kaedah itu juga boleh digunakan dengan pilihan nullIsLess . Ini adalah argumen boolean ketiga yang memutuskan sama ada nilai nol harus dianggap kurang atau tidak .
A null nilai adalah lebih rendah daripada yang lain String jika nullIsLess adalah benar dan lebih tinggi jika nullIsLess adalah palsu.
Mari mencubanya:
assertThat(StringUtils.compare(null, "abc", true)) .isEqualTo(-1); assertThat(StringUtils.compare(null, "abc", false)) .isEqualTo(1);
Kaedah membandingkanIgnoreCase () dengan argumen boolean ketiga berfungsi sama, kecuali dengan mengabaikan kes.
5. Kesimpulan
Dalam tutorial ringkas ini, kami membincangkan pelbagai cara membandingkan Strings.
Dan, seperti biasa, kod sumber untuk contoh boleh didapati di GitHub.