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)對實(shí)現(xiàn) Comparable 的對象進(jìn)行排序。
免費(fèi)在線學(xué)習(xí)視頻推薦:java學(xué)習(xí)
示例如下,我們構(gòu)建一個(gè) node 對象,并通過 node 對象之間的比較驗(yàn)證 Comparable 的用法。
node 對象的實(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 方法。
先測試一下,我們創(chuàng)建10個(gè) Node 對象并添加進(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)在輸出是亂序的,接下來我們使用 Collections.sort 對其進(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 傳遞給排序方法,以便對排序順序進(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 對象,不再實(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; } }
我們嘗試通過傳入一個(gè) Comparator 來實(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 是外比較器,若類沒有實(shí)現(xiàn) Comparable 接口但是需要對其進(jìn)行排序,我們可以考慮使用 Comparator 。從另一個(gè)角度看,使用 Comparable 接口的耦合性大于 Comparator ,因?yàn)楫?dāng)我們需要對比較算法進(jìn)行修改的時(shí)候還需要修改 Comparable 的實(shí)現(xiàn)類。
本文來自java快速入門欄目,歡迎大家一起來討論學(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)

Fail Tetapan.JSON terletak di laluan peringkat pengguna atau ruang kerja dan digunakan untuk menyesuaikan tetapan vscode. 1. Laluan peringkat pengguna: Windows adalah C: \ Users \\ AppData \ Roaming \ code \ user \ settings.json, macOS adalah /users//library/applicationsupport/code/user/settings.json, linux adalah/ 2. Laluan Tahap Ruang Kerja: .VSCODE/Tetapan dalam Direktori Root Projek

Untuk mengendalikan transaksi JDBC dengan betul, anda mesti terlebih dahulu mematikan mod komit automatik, kemudian melakukan pelbagai operasi, dan akhirnya melakukan atau mengembalikan semula hasilnya; 1. Panggil Conn.SetAutOcommit (palsu) untuk memulakan transaksi; 2. Melaksanakan pelbagai operasi SQL, seperti memasukkan dan mengemaskini; 3. Panggil Conn.Commit () jika semua operasi berjaya, dan hubungi conn.rollback () jika pengecualian berlaku untuk memastikan konsistensi data; Pada masa yang sama, cuba-dengan-sumber harus digunakan untuk menguruskan sumber, mengendalikan pengecualian dengan betul dan menutup sambungan untuk mengelakkan kebocoran sambungan; Di samping itu, adalah disyorkan untuk menggunakan kolam sambungan dan menetapkan mata simpan untuk mencapai rollback separa, dan menyimpan urus niaga sesingkat mungkin untuk meningkatkan prestasi.

DependencyInjection (DI) isadesignpatternwhereBjectsReceivedependencys ke luar, promotingloosecouplingandeasieSierTestthroughconstructor, setter, orfieldInjection.2.springframeworkusesannotationsike@component,@service, dan@autowwithjava yang berasaskan@autowwithjava

Terdapat empat cara utama untuk mendapatkan BTC: 1. Daftar dan tukar dengan mata wang fiat atau aset digital lain melalui platform perdagangan berpusat seperti Binance, OK, Huobi, dan Gate.io; 2. Mengambil bahagian dalam platform P2P untuk secara langsung berdagang dengan individu, dan memberi perhatian kepada risiko kredit rakan niaga; 3. Memberi barangan atau perkhidmatan untuk menerima BTC sebagai pembayaran; 4. Mengambil bahagian dalam udara, pertandingan dan aktiviti ganjaran platform lain untuk mendapatkan sedikit BTC. Perbezaan teras antara BTC dan mata wang digital adalah: 1. BTC adalah sejenis mata wang digital, yang dimiliki oleh hubungan genus; 2. BTC mengamalkan mekanisme Bukti Kerja (POW), manakala mata wang digital lain boleh menggunakan pelbagai teknologi seperti Bukti Stake (POS); 3. BTC menekankan fungsi penyimpanan nilai "emas digital", dan mata wang digital lain boleh memberi tumpuan kepada kecekapan pembayaran atau

THEJVMenableSjava's "Writeonce, Runanywhere" keupayaanByExecutingByteCodeThroughFourMaincomponents: 1.TheClassloadersubsystemloads, pautan, danInitializes.ClassFilesusingBootstrap, Extension, andapplicationClassloaders, EnsuringseCureAndlazyCon

Gunakan kelas dalam pakej Java.Time untuk menggantikan kelas lama dan kelas kalendar; 2. Dapatkan tarikh dan masa semasa melalui LocalDate, LocalDateTime dan Tempatan Tempatan; 3. Buat tarikh dan masa tertentu menggunakan kaedah (); 4. Gunakan kaedah tambah/tolak untuk meningkatkan dan mengurangkan masa; 5. Gunakan zoneddatetime dan zonid untuk memproses zon waktu; 6. Format dan parse date string melalui DateTimeFormatter; 7. Gunakan segera untuk bersesuaian dengan jenis tarikh lama apabila perlu; pemprosesan tarikh di java moden harus memberi keutamaan untuk menggunakan java.timeapi, yang memberikan jelas, tidak berubah dan linear

Chromecanopenlocalfileslikehtmlandpdfsbyusing "openfile" ordraggingthemintothebrowser; ensureTheaddressStartSwithFile: ///; 2.securityRestrictionsblockajax, localStorage, andcross-folderacSonfile:/ealerSoR.

NetworkPortsandFireWallSworkTogethertoenableCommunicationWileensuringsecurity.1.networkportsarevirtualendpointsNumbered0-655 35, Withwell-KnownportsLike80 (http), 443 (https), 22 (ssh), dan25 (smtp) identitispecificservices.2.portsoperateovertcp (boleh dipercayai, c
