java中的比較器comparable和Comparator的區(qū)別
Nov 27, 2019 pm 01:20 PMComparable比較器
Comparable 位于 java.lang 包下,本質(zhì)上是一個(gè)內(nèi)比較器,實(shí)現(xiàn)了 Comparable 的類可以自己比較,至于比較的結(jié)果如何則需要依賴于自然比較方法 compareTo 的實(shí)現(xiàn)。
compareTo 的返回值有 -1、0、1。若比較者大于被比較者,那么返回1,等于則返回0,小于返回-1。
Collections.sort
和 Arrays.sort
可以自動(dòng)對(duì)實(shí)現(xiàn) Comparable 的對(duì)象進(jìn)行排序。
免費(fèi)在線學(xué)習(xí)視頻推薦:java學(xué)習(xí)
示例如下,我們構(gòu)建一個(gè) node 對(duì)象,并通過(guò) node 對(duì)象之間的比較驗(yàn)證 Comparable 的用法。
node 對(duì)象的實(shí)現(xiàn)如下:
public class Node implements Comparable<Object>{ private int num; private String name; @Override public String toString() { return "num=" + num + " name=" + name; } public Node(int num, String name) { super(); this.num = num; this.name = name; } public Node() { super(); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public int compareTo(Object o) { Node node = (Node)o; return this.num - node.getNum(); } }
可以看到,我們?yōu)?Node 實(shí)現(xiàn)了 Comparable 接口,并且重寫了 compareTo 方法。
先測(cè)試一下,我們創(chuàng)建10個(gè) Node 對(duì)象并添加進(jìn) List 中,然后把順序打亂。
public class MyTest { public static void main(String[] args) { List<Node> list = new ArrayList<Node>(); for(int i = 0;i < 10;i++) { list.add(new Node(i,"node")); } //打亂順序 Collections.shuffle(list); for (Node node : list) { System.out.println(node); } } }
顯示結(jié)果如下:
num=7 name=node num=0 name=node num=5 name=node num=9 name=node num=6 name=node num=3 name=node num=4 name=node num=8 name=node num=1 name=node num=2 name=node
現(xiàn)在輸出是亂序的,接下來(lái)我們使用 Collections.sort 對(duì)其進(jìn)行排序。
public class MyTest { public static void main(String[] args) { List<Node> list = new ArrayList<Node>(); for(int i = 0;i < 10;i++) { list.add(new Node(i,"node")); } //打亂順序 Collections.shuffle(list); Collections.sort(list); for (Node node : list) { System.out.println(node); } } }
Collections.sort 其實(shí)是按 compareTo 方法中的定義進(jìn)行比較,我們之前定義了按照 num 的升序進(jìn)行排序,現(xiàn)在排序結(jié)果如下:
num=0 name=node num=1 name=node num=2 name=node num=3 name=node num=4 name=node num=5 name=node num=6 name=node num=7 name=node num=8 name=node num=9 name=node
Comparator比較器
Comparator
位于 java.util
包下,本質(zhì)上是一個(gè)外比較器。若一個(gè)類內(nèi)部未實(shí)現(xiàn) Comparable 又或者實(shí)現(xiàn)了 Comparable 但該比較方式不是自己想要的,我們可以考慮實(shí)現(xiàn) Comparator。Comparator 接口里有一個(gè) compare 方法,使用方法與 Comparable 中的 compareTo 相同。
我們需要將 Comparator 傳遞給排序方法,以便對(duì)排序順序進(jìn)行控制。我們可以查看幾個(gè)排序方法的使用方法,發(fā)現(xiàn)其可以傳入一個(gè) Comparator 參數(shù)。
Collections.sort(List<T> list, Comparator<? super T> c); Arrays.sort(T[] a, Comparator<? super T> c);
修改我們之前的 Node 對(duì)象,不再實(shí)現(xiàn) Comparable 。
public class Node{ private int num; private String name; @Override public String toString() { return "num=" + num + " name=" + name; } public Node(int num, String name) { super(); this.num = num; this.name = name; } public Node() { super(); } public int getNum() { return num; } public void setNum(int num) { this.num = num; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
我們嘗試通過(guò)傳入一個(gè) Comparator 來(lái)實(shí)現(xiàn)降序排序。
public class MyTest { public static void main(String[] args) { List<Node> list = new ArrayList<Node>(); for(int i = 0;i < 10;i++) { list.add(new Node(i,"node")); } //打亂順序 Collections.shuffle(list); Collections.sort(list, new Comparator<Node>() { @Override public int compare(Node o1, Node o2) { return o2.getNum()-o1.getNum(); } }); for (Node node : list) { System.out.println(node); } } }
結(jié)果如下:
num=9 name=node num=8 name=node num=7 name=node num=6 name=node num=5 name=node num=4 name=node num=3 name=node num=2 name=node num=1 name=node num=0 name=node
Comparator 實(shí)現(xiàn)了逆序比較。
總結(jié)
Comparable 是內(nèi)比較器,Comparator 是外比較器,若類沒(méi)有實(shí)現(xiàn) Comparable 接口但是需要對(duì)其進(jìn)行排序,我們可以考慮使用 Comparator 。從另一個(gè)角度看,使用 Comparable 接口的耦合性大于 Comparator ,因?yàn)楫?dāng)我們需要對(duì)比較算法進(jìn)行修改的時(shí)候還需要修改 Comparable 的實(shí)現(xiàn)類。
本文來(lái)自java快速入門欄目,歡迎大家一起來(lái)討論學(xué)習(xí)!
Atas ialah kandungan terperinci java中的比較器comparable和Comparator的區(qū)別. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Mekanisme pemuatan kelas Java dilaksanakan melalui kelas, dan aliran kerja terasnya dibahagikan kepada tiga peringkat: memuatkan, menghubungkan dan memulakan. Semasa fasa pemuatan, kelas muat turun secara dinamik membaca bytecode kelas dan mencipta objek kelas; Pautan termasuk mengesahkan ketepatan kelas, memperuntukkan memori kepada pembolehubah statik, dan rujukan simbol parsing; Inisialisasi melakukan blok kod statik dan tugasan pembolehubah statik. Pemuatan kelas mengamalkan model delegasi induk, dan mengutamakan loader kelas induk untuk mencari kelas, dan cuba bootstrap, lanjutan, dan appliclassloader pada gilirannya untuk memastikan perpustakaan kelas teras selamat dan mengelakkan pemuatan pendua. Pemaju boleh menyesuaikan kelas, seperti UrlClassl

Java menyokong pengaturcaraan asynchronous termasuk penggunaan aliran yang boleh diselesaikan, aliran responsif (seperti ProjectReactor), dan benang maya di Java19. 1.CompletableFuture meningkatkan kebolehbacaan dan penyelenggaraan kod melalui panggilan rantai, dan menyokong orkestrasi tugas dan pengendalian pengecualian; 2. ProjectReactor menyediakan jenis mono dan fluks untuk melaksanakan pengaturcaraan responsif, dengan mekanisme tekanan belakang dan pengendali yang kaya; 3. Thread maya mengurangkan kos konvensional, sesuai untuk tugas I/O-intensif, dan lebih ringan dan lebih mudah untuk berkembang daripada benang platform tradisional. Setiap kaedah mempunyai senario yang berkenaan, dan alat yang sesuai harus dipilih mengikut keperluan anda dan model campuran harus dielakkan untuk mengekalkan kesederhanaan

Javanio adalah IOAPI baru yang diperkenalkan oleh Java 1.4. 1) bertujuan untuk penampan dan saluran, 2) mengandungi komponen teras penampan, saluran dan pemilih, 3) menyokong mod tidak menyekat, dan 4) mengendalikan sambungan serentak lebih cekap daripada IO tradisional. Kelebihannya dicerminkan dalam: 1) IO yang tidak menyekat mengurangkan overhead thread, 2) Buffer meningkatkan kecekapan penghantaran data, 3) pemilih menyedari multiplexing, dan 4) memori pemetaan memori sehingga membaca dan menulis fail. Nota Apabila menggunakan: 1) Operasi flip/jelas penampan mudah dikelirukan, 2) Data yang tidak lengkap perlu diproses secara manual tanpa menyekat, 3) Pendaftaran pemilih mesti dibatalkan dalam masa, 4) NIO tidak sesuai untuk semua senario.

Kelas dalaman tanpa nama digunakan di Java untuk membuat subkelas atau melaksanakan antara muka dengan cepat, dan sering digunakan untuk mengatasi kaedah untuk mencapai tujuan tertentu, seperti pengendalian peristiwa dalam aplikasi GUI. Borang sintaksnya adalah antara muka atau kelas baru yang secara langsung mentakrifkan badan kelas, dan memerlukan pembolehubah tempatan yang diakses mestilah muktamad atau setara tidak berubah. Walaupun mereka mudah, mereka tidak boleh digunakan terlalu banyak. Terutamanya apabila logiknya kompleks, mereka boleh digantikan oleh ekspresi Lambda Java8.

Di Java, enums sesuai untuk mewakili set tetap tetap. Amalan terbaik termasuk: 1. Gunakan enum untuk mewakili keadaan tetap atau pilihan untuk meningkatkan keselamatan jenis dan kebolehbacaan; 2. Tambah sifat dan kaedah untuk meningkatkan fleksibiliti, seperti menentukan bidang, pembina, kaedah penolong, dan lain -lain; 3. Gunakan enummap dan enumset untuk meningkatkan prestasi dan jenis keselamatan kerana mereka lebih cekap berdasarkan tatasusunan; 4. Elakkan penyalahgunaan enum, seperti nilai dinamik, perubahan kerap atau senario logik kompleks, yang harus digantikan dengan kaedah lain. Penggunaan enum yang betul boleh meningkatkan kualiti kod dan mengurangkan kesilapan, tetapi anda perlu memberi perhatian kepada sempadannya yang berkenaan.

Duit syiling yang stabil mengekalkan kestabilan harga dengan menambat mata wang fiat seperti dolar AS, yang terutamanya dibahagikan kepada tiga kategori: 1. 2. Jenis pemulihan cryptocurrency seperti DAI; 3. Jenis algoritma mempunyai risiko yang lebih tinggi. Stablecoins arus perdana termasuk USDT dengan nilai pasaran tertinggi dan kecairan terbaik. USDC terkenal dengan pematuhan dan ketelusannya. Dai bergantung pada mekanisme yang terdesentralisasi. TUSD mengamalkan audit masa nyata di rantaian. BUSD secara beransur -ansur menarik diri dari pasaran kerana pengawasan. USDP terkenal dengan pematuhan dan keselamatannya yang tinggi. Kedua -duanya diedarkan secara meluas di bursa arus perdana.

Urus niaga rantaian adalah urus niaga secara langsung pada rangkaian blockchain. Mereka terbuka dan telus, jus-bukti, keselamatan yang terdesentralisasi dan tinggi, tetapi mereka lebih perlahan, mempunyai yuran yang tinggi dan tidak boleh ditarik balik; Urus niaga rantaian berlaku di luar blok block, dan mempunyai kelebihan kelajuan cepat, yuran yang rendah dan boleh dibatalkan, tetapi bergantung kepada institusi berpusat dan kekurangan ketelusan dan keselamatan. 1. Urus niaga rantaian memerlukan yuran gas dan tunggu pengesahan blok, yang sesuai untuk pengguna yang mengejar keselamatan dan ketelusan; 2. Urus niaga di luar rantaian adalah cekap, sesuai untuk urus niaga frekuensi tinggi dan kecil, tetapi platform amanah; 3. Platform yang menyokong urus niaga rantaian termasuk platform yang terdesentralisasi seperti UniSwap, Pancakeswap, OpenSea, Aave; 4. Platform yang menyokong urus niaga rantaian terutamanya termasuk Binanc

Gunakan media pemasangan untuk memasuki persekitaran pemulihan; 2. Jalankan perintah bootrec untuk membaiki rekod boot; 3. Semak kesilapan cakera dan fail sistem pembaikan; 4. Lumpuhkan pembaikan automatik sebagai cara sementara. Gelung pembaikan automatik Windows biasanya disebabkan oleh fail sistem rasuah, kesilapan cakera keras atau keabnormalan konfigurasi boot. Penyelesaiannya termasuk penyelesaian masalah dengan memasang pemacu kilat USB ke dalam persekitaran pemulihan, menggunakan BootRec untuk membaiki MBR dan BCD, menjalankan CHKDSK dan DISM/SFC untuk membaiki cakera dan fail sistem. Sekiranya ia tidak sah, fungsi pembaikan automatik boleh dilumpuhkan buat sementara waktu, tetapi punca utama perlu diperiksa kemudian untuk memastikan bahawa cakera keras dan struktur boot adalah normal.
