国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

首頁 Java Java入門 java中的比較器comparable和Comparator的區(qū)別

java中的比較器comparable和Comparator的區(qū)別

Nov 27, 2019 pm 01:20 PM
comparable comparator java 差別 比較器

java中的比較器comparable和Comparator的區(qū)別

Comparable比較器

Comparable 位於java.lang 套件下,本質上是一個內比較器,實作了Comparable 的類別可以自己比較,至於比較的結果如何則需要依賴自然比較方法compareTo 的實作。

compareTo 的回傳值有 -1、0、1。若比較者大於被比較者,那麼回傳1,等於則回傳0,小於返回-1。

Collections.sortArrays.sort 可以自動對實作 Comparable 的物件進行排序。

免費線上學習影片推薦:java學習

範例如下,我們建立一個 node 對象,並透過 node 物件之間的比較驗證 Comparable 的用法。

node 物件的實作如下:

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 實作了 Comparable 接口,並且重寫了 compareTo 方法。

先測試一下,我們建立10個 Node 物件並加入到 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);
		}
	}
}

顯示結果如下:

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 對其進行排序。

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 其實是按compareTo 方法中的定義進行比較,我們之前定義了按照num 的升序進行排序,現(xiàn)在排序結果如下:

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 套件下,本質上是一個外比較器。若一個類別內部未實作 Comparable 又或實作了 Comparable 但該比較方式不是自己想要的,我們可以考慮實作 Comparator。 Comparator 介面裡有一個 compare 方法,使用方法與 Comparable 中的 compareTo 相同。

我們需要將 Comparator 傳遞給排序方法,以便對排序順序進行控制。我們可以查看幾個排序方法的使用方法,發(fā)現(xiàn)可以傳入一個 Comparator 參數(shù)。

Collections.sort(List<T> list, Comparator<? super T> c);
Arrays.sort(T[] a, Comparator<? super T> c);

修改我們先前的 Node 對象,不再實作 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;
	}
	
}

我們嘗試透過傳入一個 Comparator 來實現(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);
		}
	}
}

結果如下:

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 實作了逆序比較。

總結

Comparable 是內比較器,Comparator 是外比較器,如果類別沒有實作 Comparable 介面但是需要對其進行排序,我們可以考慮使用 Comparator 。從另一個角度來看,使用 Comparable 介面的耦合性大於 Comparator ,因為當我們需要對比較演算法進行修改的時候還需要修改 Comparable 的實作類別。

本文來自java快速入門欄目,歡迎大家一起來討論學習!

以上是java中的比較器comparable和Comparator的區(qū)別的詳細內容。更多資訊請關注PHP中文網(wǎng)其他相關文章!

本網(wǎng)站聲明
本文內容由網(wǎng)友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發(fā)現(xiàn)涉嫌抄襲或侵權的內容,請聯(lián)絡admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java Classloader在內部如何工作 Java Classloader在內部如何工作 Jul 06, 2025 am 02:53 AM

Java的類加載機制通過ClassLoader實現(xiàn),其核心工作流程分為加載、鏈接和初始化三個階段。加載階段由ClassLoader動態(tài)讀取類的字節(jié)碼並創(chuàng)建Class對象;鏈接包括驗證類的正確性、為靜態(tài)變量分配內存及解析符號引用;初始化則執(zhí)行靜態(tài)代碼塊和靜態(tài)變量賦值。類加載採用雙親委派模型,優(yōu)先委託父類加載器查找類,依次嘗試Bootstrap、Extension和ApplicationClassLoader,確保核心類庫安全且避免重複加載。開發(fā)者可自定義ClassLoader,如URLClassL

現(xiàn)代爪哇的異步編程技術 現(xiàn)代爪哇的異步編程技術 Jul 07, 2025 am 02:24 AM

Java支持異步編程的方式包括使用CompletableFuture、響應式流(如ProjectReactor)以及Java19 中的虛擬線程。 1.CompletableFuture通過鍊式調用提升代碼可讀性和維護性,支持任務編排和異常處理;2.ProjectReactor提供Mono和Flux類型實現(xiàn)響應式編程,具備背壓機制和豐富的操作符;3.虛擬線程減少並發(fā)成本,適用於I/O密集型任務,與傳統(tǒng)平臺線程相比更輕量且易於擴展。每種方式均有適用場景,應根據(jù)需求選擇合適工具並避免混合模型以保持簡潔性

了解Java Nio及其優(yōu)勢 了解Java Nio及其優(yōu)勢 Jul 08, 2025 am 02:55 AM

JavaNIO是Java1.4引入的新型IOAPI,1)面向緩衝區(qū)和通道,2)包含Buffer、Channel和Selector核心組件,3)支持非阻塞模式,4)相比傳統(tǒng)IO更高效處理並發(fā)連接。其優(yōu)勢體現(xiàn)在:1)非阻塞IO減少線程開銷,2)Buffer提升數(shù)據(jù)傳輸效率,3)Selector實現(xiàn)多路復用,4)內存映射加快文件讀寫。使用時需注意:1)Buffer的flip/clear操作易混淆,2)非阻塞下需手動處理不完整數(shù)據(jù),3)Selector註冊需及時取消,4)NIO並非適用於所有場景。

什麼是匿名的內部班級? 什麼是匿名的內部班級? Jul 07, 2025 am 02:18 AM

匿名內部類在Java中用於即時創(chuàng)建子類或實現(xiàn)接口,常用於覆蓋方法以實現(xiàn)特定目的,如GUI應用中的事件處理。其語法形式為new接口或類後直接定義類體,並要求訪問的局部變量必須是final或等效不可變的。它們雖便捷但不宜過度使用,尤其在邏輯複雜時,可用Java8 的Lambda表達式替代。

在Java中使用枚舉的最佳實踐 在Java中使用枚舉的最佳實踐 Jul 07, 2025 am 02:35 AM

在Java中,枚舉(enum)適合表示固定常量集合,最佳實踐包括:1.用enum表示固定狀態(tài)或選項,提升類型安全和可讀性;2.為枚舉添加屬性和方法以增強靈活性,如定義字段、構造函數(shù)、輔助方法等;3.使用EnumMap和EnumSet提高性能和類型安全性,因其基於數(shù)組實現(xiàn)更高效;4.避免濫用enum,如動態(tài)值、頻繁變更或複雜邏輯場景應使用其他方式替代。正確使用enum能提升代碼質量並減少錯誤,但需注意其適用邊界。

穩(wěn)定幣有哪幾種 數(shù)字貨幣穩(wěn)定幣有哪些 穩(wěn)定幣有哪幾種 數(shù)字貨幣穩(wěn)定幣有哪些 Jul 08, 2025 pm 11:51 PM

穩(wěn)定幣通過錨定美元等法定貨幣維持價格穩(wěn)定,主要分為三類:1. 法定貨幣抵押型如USDT、USDC;2. 加密貨幣抵押型如DAI;3. 算法型風險較高。主流穩(wěn)定幣包括USDT市值最高且流動性最好,USDC以合規(guī)透明著稱,DAI依托去中心化機制,TUSD采用鏈上實時審計,BUSD因監(jiān)管逐步退出市場,USDP則以高合規(guī)性和安全性見長,均在主流交易所廣泛流通。

什麼是鏈上交易和鏈下交易?有何不同? 什麼是鏈上交易和鏈下交易?有何不同? Jul 07, 2025 pm 08:45 PM

鏈上交易是直接在區(qū)塊鍊網(wǎng)絡上進行的交易,具有公開透明、不可篡改、去中心化和安全性高的特點,但速度較慢、費用較高且不可撤銷;鏈下交易則發(fā)生在區(qū)塊鏈之外,具備速度快、費用低、可撤銷等優(yōu)勢,但依賴中心化機構,缺乏透明性和安全性。 1. 鏈上交易需支付燃氣費,需等待區(qū)塊確認,適合追求安全與透明的用戶;2. 鏈下交易效率高,適合高頻與小額交易,但需信任平臺;3. 支持鏈上交易的平臺包括Uniswap、PancakeSwap、OpenSea、Aave等去中心化平臺;4. 支持鏈下交易的平臺主要包括Binanc

Java中的單例設計模式是什麼? Java中的單例設計模式是什麼? Jul 09, 2025 am 01:32 AM

單例設計模式在Java中通過私有構造器和靜態(tài)方法確保一個類只有一個實例並提供全局訪問點,適用於控制共享資源的訪問。實現(xiàn)方式包括:1.懶加載,即首次請求時才創(chuàng)建實例,適用於資源消耗大且不一定需要的情況;2.線程安全處理,通過同步方法或雙重檢查鎖定確保多線程環(huán)境下只創(chuàng)建一個實例,並減少性能影響;3.餓漢式加載,在類加載時直接初始化實例,適合輕量級對像或可接受提前初始化的場景;4.枚舉實現(xiàn),利用Java枚舉天然支持序列化、線程安全及防止反射攻擊的特性,是推薦的簡潔可靠方式。不同實現(xiàn)方式可根據(jù)具體需求選

See all articles