Penjelasan terperinci dan perbedaan antara Java yang sebanding dan pembanding
Java memberi kita dua mekanisme perbandingan: sebanding dan pembanding. Apa perbedaan di antara mereka? Mari kita cari tahu hari ini.
Jenis alami yang sebanding
Banding adalah antarmuka di bawah paket java.lang, dan hanya ada satu metode yang compareto () di dalam:
antarmuka publik sebanding <T> {public int compareto (t o);}Sebanding memungkinkan objek kelas yang mengimplementasikannya dibandingkan. Aturan perbandingan spesifik dilakukan sesuai dengan aturan dalam metode CompareTo. Urutan ini disebut urutan alam.
Ada tiga kasus di mana nilai pengembalian metode compareTo adalah:
Melihat:
1. Karena NULL bukan kelas atau objek, Anda harus memperhatikan kasus E.Comppareto (null) saat menulis ulang metode CompareTo. Bahkan jika E.Equals (NULL) mengembalikan False, metode compareto harus secara aktif melempar pengecualian pointer nol nullpointerException.
2. Saat mengimplementasikan kelas yang sebanding untuk menulis ulang metode compareTo, hasil e1.comppareto (E2) == 0 umumnya diperlukan untuk konsisten dengan E1.Equals (E2). Dengan cara ini, di masa depan, ketika menggunakan SortedSet dan wadah koleksi lainnya diurutkan sesuai dengan jenis kelas alami, urutan data yang disimpan dapat dipastikan konsisten dengan imajinasi.
Beberapa orang mungkin ingin tahu tentang apa yang akan terjadi jika poin kedua di atas dilanggar?
Misalnya, jika Anda menambahkan dua objek A dan B ke sortedset, AB memuaskan (! A.Equals (b) && a.compareto (b) == 0), dan tidak ada pembanding lain yang ditentukan, maka ketika Anda menambahkan A dan kemudian B, itu akan menambah false, dan ukuran sortedset tidak akan meningkat, karena dalam sortedset mereka sama, dan duPlication tidak akan meningkat.
Faktanya, hasil dari semua kelas inti Java yang mengimplementasikan antarmuka yang sebanding konsisten dengan metode EqualAs.
Daftar atau array yang mengimplementasikan antarmuka yang sebanding dapat diurutkan menggunakan metode collections.sort () atau arrays.sort ().
Hanya objek yang mengimplementasikan antarmuka yang sebanding yang dapat digunakan secara langsung sebagai kunci sortedmap (sortedset), jika tidak, aturan penyortiran pembanding harus ditentukan di luar.
Oleh karena itu, jika Anda ingin menggunakan kelas koleksi yang dipesan untuk kelas yang Anda definisikan sendiri, Anda perlu menerapkan antarmuka yang sebanding, seperti:
** * Deskripsi: Buku kelas entitas yang digunakan untuk pengujian, mengimplementasikan antarmuka yang sebanding, penyortiran alami * <br/> * Penulis: Shixinzhang * <br/> * Data: 10/5/2016 */Kelas Publik Bookbean mengimplementasikan serializable, sebanding {nama string pribadi; Hitungan int pribadi; Bookbean publik (nama string, int count) {this.name = name; this.count = count; } public string getName () {return name; } public void setName (name string) {this.name = name; } public int getCount () {return count; } public void setCount (int count) {this.count = count; } / ** * Menulis ulang sama dengan * @param o * @return * / @override public boolean sama (objek o) {if (this == o) return true; if (! (o contoh bookbean)) mengembalikan false; Bookbean bean = (bookbean) o; if (getCount ()! = bean.getCount ()) return false; return getName (). Equals (bean.getName ()); } /*** Tulis ulang metode perhitungan kode hashcode* Perhitungan iteratif berdasarkan semua atribut untuk menghindari duplikasi* Faktor perhitungan 31 terlihat ketika menghitung kode hash. Ini adalah bilangan prima dan tidak dapat dibagi lagi * @return */ @Override int hashCode () {// hashCode string panggilan (), yang hanya mewakili konten string int result = getName (). HashCode (); // kalikan dengan 31, ditambah hasil jumlah = 31 * hasil + getCount (); hasil pengembalian; } @Override public string toString () {return "bookbean {" + "name = '" + name +'/'' + ", count =" + count + '}'; } / ** * Saat menambahkan bookbean ke treeset, metode ini akan dipanggil untuk menyortir * @param lain * @return * / @override int compareto publik (objek lain) {if (instance lain dari bookbean) {bookbean lain buku lain = (bookbean) lain; hasil int; // misalnya, menyortir berdasarkan harga buku di sini hasil = getCount () - OtherBook.getCount (); // atau ikuti string urutan perbandingan // result = getName (). CompareTo (OtherBook.getName ()); if (result == 0) {// Ketika harga buku sama, bandingkan judulnya. Pastikan bahwa semua atribut dibandingkan hasil = getName (). CompareTo (OtherBook.getName ()); } hasil pengembalian; } // return 0 return 0; }Kode di atas juga menulis ulang metode EqualAs () dan HashCode (). Kelas khusus perlu menulis ulang metode ini ketika mereka ingin membandingkannya.
Saat menulis ulang Compareto nanti, Anda perlu menilai apakah atribut tertentu sama dan membandingkan semua atribut sekali.
Antarmuka yang sebanding adalah bagian dari Kerangka Koleksi Java.
Sortir Kustom Pembanding
Pembanding juga merupakan antarmuka di bawah paket java.util. Sebelum JDK 1.8, hanya ada dua metode:
Komparator Antarmuka Publik <T> {Public int Compare (T LHS, T RHS); Boolean publik sama dengan (objek objek);}Banyak metode baru telah ditambahkan ke JDK 1.8:
Pada dasarnya, mereka semua terkait dengan fungsi, dan penambahan baru ke 1,8 tidak akan diperkenalkan di sini.
Dari hal di atas, kita dapat melihat bahwa menggunakan penyortiran alami membutuhkan kelas untuk mengimplementasikan yang sebanding, dan metode Comparato dipesan ulang secara internal.
Komparator menetapkan aturan penyortiran secara eksternal dan meneruskannya ke kelas -kelas tertentu sebagai parameter kebijakan yang menyortir, seperti collections.sort (), arrays.sort (), atau beberapa koleksi yang dipesan secara internal (seperti sortedset, sortedmap, dll.).
Cara menggunakannya terutama dibagi menjadi tiga langkah:
1. Buat kelas implementasi antarmuka pembanding dan tetapkan nilai ke suatu objek
Tulis aturan penyortiran untuk kelas kustom dalam metode perbandingan
2. Lewati objek pembanding sebagai parameter ke metode kelas penyortiran
3. Tambahkan kelas khusus yang digunakan dalam metode perbandingan ke kelas penyortiran
Misalnya:
// 1. Buat objek yang mengimplementasikan Comparatator Interface Comparator = new comparator () {@Override Public int Compare (Object Object1, Object Object2) {if (Object1 instanceof newBookBean && Object2 Instance dari NewBookBean) {newBookBean newBookBean = (newBookBean) Object1; NewBookBean newBookBean1 = (newBookBean) Object2; // Lihat perbandingan dalam penyortiran alami untuk metode perbandingan spesifik, berikut adalah chestnut return newBookBean.getCount () - newBookBean1.getCount (); } return 0; }}; // 2. Lewati objek ini sebagai parameter formal untuk konstruktor Treeset Treeset = TreeSet baru (pembanding); // 3. Tambahkan objek kelas yang dirancang dalam metode perbandingan di Langkah 1 ke Treeset ke TreeSet Treeset.Add (NewBookBean baru ("A", 34)); Treeeset.add (newBookBean baru ("S", 1)); Treeeset.Add (newBookBean baru ("V", 46)); Treeeset.Add (newBookBean baru ("Q", 26));Bahkan, kita dapat melihat bahwa penggunaan pembanding adalah model strategi. Siswa yang tidak terbiasa dengan model strategi dapat mengklik di sini untuk melihat: Mode Strategi: Pelajari tentang rutinitas tetap novel online.
Referensi ke antarmuka pembanding diadakan di kelas Sort:
Pembanding <? super k> pembanding;
Kami dapat lulus dalam berbagai kelas implementasi aturan penyortiran kustom dan merumuskan berbagai strategi penyortiran untuk kelas yang sama.
Meringkaskan
Dua metode penyortiran di Java:
Penyortiran alami yang sebanding. (Implementasi kelas entitas)
Pembanding adalah jenis kustom. (Jika kelas entitas tidak dapat dimodifikasi, dibuat langsung di penelepon)
Ketika ada pada saat yang sama, ia menggunakan aturan pembanding (penyortiran khusus) untuk perbandingan.
Untuk beberapa tipe data biasa (seperti String, Integer, Double ...), mereka mengimplementasikan antarmuka yang sebanding secara default dan mengimplementasikan metode CompareTo, yang dapat kita gunakan secara langsung.
Untuk beberapa kelas khusus, mereka mungkin perlu menerapkan berbagai strategi perbandingan dalam situasi yang berbeda. Kami dapat membuat antarmuka pembanding baru dan kemudian membandingkannya menggunakan implementasi pembanding tertentu.
Ini adalah perbedaan antara sebanding dan pembanding.
Terima kasih telah membaca, saya harap ini dapat membantu Anda. Terima kasih atas dukungan Anda untuk situs ini!