《Java對象“比武場“:Comparable與Comparator的巔峰對決》

目錄

引言:

一、認識接口

1.1 Comparable

1.2?Comparator

?編輯

1.3 核心概念對比

二、代碼實現對比

2.1 Comparable 實現示例

2.2 Comparator 實例示例

三、核心區別詳解

3.1 設計理念差異

3.2 方法調用

3.3 使用情景

四、本質區別總結


引言:

在 Java 開發中,對象的比較是常見的需求。Java 給我們提供了兩個接口 Comparable 與 Comparator 接口,這兩個接口的核心功能是定義對象之間的比較規則。但是二者的使用規則和環境又有所不同,接下來讓我們一同來了解其所在差異。


一、認識接口

我們可以在 jdk-api-1.8 文檔中查看這兩個接口的具體實現:

1.1 Comparable


1.2?Comparator


1.3 核心概念對比

特性ComparableComparato
包位置java.langjava.util
核心方法compareTo(T o)compare(T o1, T o2)
排序類型自然比較定制比較
多比較策略不支持支持多個
影響原類需要修改類不修改原類
使用場景默認比較規則特殊比較需求

二、代碼實現對比

2.1 Comparable 實現示例

讓對象具備自我比較能力。換句話說就是:自己和別人比

class Person implements Comparable<Person> {String name;int age;public Person(String name, int age) {this.name = name;this.age = age;}// 自然比較:按年齡@Overridepublic int compareTo(Person other) {// 比較規則可以自己規定return Integer.compare(this.age, other.age);/*retutn this.age - other.age;這樣定義比較規則也是可以的,但存在一個潛在風險需要特別注意當比較值非常大時(接近Integer.MAX_VALUE或Integer.MIN_VALUE),減法運算可能導致整數溢出*/}
}public class Test {public static void main(String[] args) {// 實例化對象并直接比較Person alice = new Person("Alice", 25);Person bob = new Person("Bob", 30);int result = alice.compareTo(bob);System.out.println("年齡比較結果:" + interpretResult(result));}private static String interpretResult(int result) {if (result < 0) return "Alice比Bob年輕";else if (result > 0) return "Alice比Bob年長";return "兩人同齡";}
}// 執行結果:  年齡比較結果:Alice比Bob年輕


2.2 Comparator 實例示例

通過外部比較器靈活比較。換句話說就是:你媽媽拿你和別人家的孩子比(學習成績、聽不聽話、做不做家務……)

import java.util.Comparator;// 獨立比較器類(按姓名)
class NameComparator implements Comparator<Person> {@Overridepublic int compare(Person p1, Person p2) {return p1.name.compareTo(p2.name);}
}public class Test2 {public static void main(String[] args) {// 實例化對象并使用比較器Person Tom = new Person("Tom", 28);Person Sam = new Person("Sam", 22);// 使用具體比較器Comparator<Person> nameComp = new NameComparator();int nameResult = nameComp.compare(Tom, Sam);System.out.println("姓名比較結果:" + (nameResult < 0 ? "Tom在Sam之前" : "Tom在Sam之后"));// 匿名內部類比較器Comparator<Person> ageComp = new Comparator<Person>() {@Overridepublic int compare(Person p1, Person p2) {return Integer.compare(p1.age, p2.age);}};int ageResult = ageComp.compare(Tom, Sam);System.out.println("年齡比較結果:" + (ageResult < 0 ? "Tom更年輕" : "Tom更年長"));}
}// 執行結果:
// 姓名比較結果:Tom在Sam之后
// 年齡比較結果:Tom更年長


三、核心區別詳解

3.1 設計理念差異

  • Comparable?

    對象自身實現比較邏輯,如同“自我認知”:
    Temperature t1 = new Temperature(25.5);
    Temperature t2 = new Temperature(30.0);
    t1.compareTo(t2); // 溫度計自己知道如何比較
  • Comparator

    外部策略定義比較規則,如同“第三視角”:
    Product iphone = new Product("Phone", 9999.99);
    Product XiaoMi = new Product("XiaoMi", 1999.99);PriceComparator priceJudge = new PriceComparator();
    priceJudge.compare(iphone, XiaoMi); // 外部比較器裁決價格高低

3.2 方法調用

// Comparable調用方式
objA.compareTo(objB);  // 對象A主動比較對象B// Comparator調用方式
comparator.compare(objA, objB);  // 比較器獨立比較兩個對象

3.3 使用情景

  • 選擇 Comparable :

    1. 對象有明顯的自然順序(如日期、溫度……)
    2. 需要作為默認比較規則
    ?
  • 選擇 Comparator :

    1. 需要多種比較方式
    2. 無法修改類源碼(如第三方庫的類)
    3.需要臨時比較規則

四、本質區別總結

對比維度ComparableComparator
比較主體對象自身具備比較能力第三方執行比較
代碼侵入性需要修改類結構無需修改原類
比較視角第一人稱( this? vs? other )第三人稱(旁觀者觀察兩個對象)
方法調用obj1.compareTo(obj2)comparator.compara(obj1,obj2)
設計理念內聚性(比較邏輯屬于對象本身)多比較策略

積跬步,以致千里

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/73336.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73336.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/73336.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android自動化測試工具

細解自動化測試工具 Airtest-CSDN博客 以下是幾種常見的Android應用自動化測試工具&#xff1a; Appium&#xff1a;支持多種編程語言&#xff0c;如Java、Python、Ruby、JavaScript等。可以用于Web應用程序和原生應用程序的自動化測試&#xff0c;并支持iOS和Android平臺。E…

Go vs Rust vs C++ vs Python vs Java:誰主后端沉浮

一、核心性能對比(基于TechEmpower基準測試) 語言單核QPS延遲(ms)內存消耗適用場景Rust650,0000.1245MB高頻交易/區塊鏈C++720,0000.0932MB游戲服務器/實時渲染Go230,0000.45110MB微服務/API網關Java180,0001.2450MB企業ERP/銀行系統Python12,0008.5220MBAI接口/快速原型技術…

vue3:八、登錄界面實現-頁面初始搭建、基礎實現

一、初始工作 1、創建登錄文件 在src/views中創建文件LoginView.vue文件 2、創建路由 在router/index.js中增加登錄的信息 代碼 import { createRouter, createWebHistory } from vue-router import HomeView from ../views/HomeView.vue const router createRouter({hist…

結構型模式之適配器模式:讓不兼容的接口兼容

在軟件開發中&#xff0c;經常會遇到這樣一種情況&#xff1a;系統的不同部分需要進行交互&#xff0c;但由于接口不兼容&#xff0c;導致無法直接使用。這時&#xff0c;適配器模式&#xff08;Adapter Pattern&#xff09;就能派上用場。適配器模式是設計模式中的結構型模式&…

Qt從入門到入土(十) -數據庫操作--SQLITE

認識 數據庫是用于存儲、管理和檢索數據的系統化集合。它是一種按照特定結構組織數據的存儲方式&#xff0c;通過軟件&#xff08;數據庫管理系統&#xff0c;DBMS&#xff09;來實現數據的高效存儲、查詢、更新和管理。通過文件存儲數據適用于少量的數據&#xff0c;而當擁有…

Django REST Framework中的序列化器類和視圖類

序列化器類 一、Serializer序列化類 Serializer是DRF的序列化器基類&#xff0c;提供基本功能&#xff0c;使用Serializer類需要自己定義字段名稱和類型。 BookSerializer(Serializer):name serializers.CharField()price serlializers.IntegerField()date serlializers.…

圖像分類數據集

《動手學深度學習》-3.5-學習筆記 # 通過ToTensor實例將圖像數據從PIL類型變換成32位浮點數格式&#xff0c; # 并除以255使得所有像素的數值均在0&#xff5e;1之間 trans transforms.ToTensor()#用于將圖像數據從 PIL 圖像格式&#xff08;Python Imaging Library&#xff…

架構師面試(十五):熔斷設計

問題 某電商平臺經常需要在大促運營活動中暫停評論、退款等業務&#xff0c;基于服務治理的設計理念&#xff0c;我們需要對該電商平臺微服務系統的【服務熔斷】進行設計&#xff0c;對此下面描述中說法正確的有哪幾項呢&#xff1f; A. 服務管控系統管理著平臺中所有服務之間…

Ubuntu20.04安裝運行DynaSLAM

目錄 一、安裝Anaconda 二、相關依賴庫安裝 1、boost安裝 2、Eigen 3安裝 3、opencv安裝 4、Pangolin安裝 三、配置Mask_RCNN環境 四、DynaSLAM編譯 五、DynaSLAM運行 一、安裝Anaconda 打開以下鏈接&#xff1a; Index of / 下載和自己系統匹配的安裝包。這里下…

X86 RouterOS 7.18 設置筆記三:防火墻設置(IPV4)

X86 j4125 4網口小主機折騰筆記五&#xff1a;PVE安裝ROS RouterOS X86 RouterOS 7.18 設置筆記一&#xff1a;基礎設置 X86 RouterOS 7.18 設置筆記二&#xff1a;網絡基礎設置(IPV4) X86 RouterOS 7.18 設置筆記三&#xff1a;防火墻設置(IPV4) X86 RouterOS 7.18 設置筆記四…

從 YOLOv1 到 YOLOv2:目標檢測的進化之路

引言 你有沒有想過&#xff0c;當你用手機拍一張照片&#xff0c;里面的人、車、狗是怎么被自動識別出來的&#xff1f;這背后靠的就是目標檢測技術。目標檢測是計算機視覺中的一個重要領域&#xff0c;它不僅要回答“圖片里有什么”&#xff0c;還要告訴你“這些東西在哪里”…

數據的存儲---整型、浮點型

目錄 一、整型在內存中的存儲 1. 原碼、反碼、補碼 2. 大端與小端 二、浮點數在內存中的存儲 1.浮點數的存 2. 浮點數的取 3. 題目解析 一個變量的創建需要在內存中開辟空間&#xff0c;而開辟的空間大小是由數據類型決定的。下面我們就來討論一下整型、浮點型在內存中的…

Java 大視界 -- Java 大數據在智能教育虛擬實驗室建設與實驗數據分析中的應用(132)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

??Jolt -- 通過JSON配置來處理復雜數據轉換的工具

簡介&#xff1a;一個能夠通過JSON配置&#xff08;特定的語法&#xff09;來處理復雜數據轉換的工具。 比如將API響應轉換為內部系統所需的格式&#xff0c;或者處理來自不同來源的數據結構差異。例如&#xff0c;將嵌套的JSON結構扁平化&#xff0c;或者重命名字段&#xff0…

47.全排列 II

47.全排列 II 力扣題目鏈接 給定一個可包含重復數字的序列 nums &#xff0c;按任意順序 返回所有不重復的全排列。 示例 1&#xff1a; 輸入&#xff1a;nums [1,1,2] 輸出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 輸入&#xff1a;nums [1,2,3] 輸出…

centos沒有ll

vi /etc/bashrc alias ll‘ls -l’ source /etc/bashrc

04 1個路由器配置一個子網的dhcp服務

前言 這是最近一個朋友的 ensp 相關的問題, 這里來大致了解一下 ensp, 計算機網絡拓撲 相關基礎知識 這里一系列文章, 主要是參照了這位博主的 ensp 專欄 這里 我只是做了一個記錄, 自己實際操作了一遍, 增強了一些 自己的理解 當然 這里僅僅是一個 簡單的示例, 實際場景…

網絡空間安全(31)安全巡檢

一、定義與目的 定義&#xff1a; 安全巡檢是指由專業人員或特定部門負責&#xff0c;對各類設施、設備、環境等進行全面或重點檢查&#xff0c;及時發現潛在的安全隱患或問題。 目的&#xff1a; 預防事故發生&#xff1a;通過定期的安全巡檢&#xff0c;及時發現并解決潛在的…

在IGH ethercat主站中Domain和Entry之間的關系

在 IGH EtherCAT 主站中&#xff0c;“domain”&#xff08;域&#xff09;和 “entry”&#xff08;條目&#xff09;存在著緊密的關系&#xff0c;具體如下&#xff1a; 數據組織與管理方面&#xff1a;“domain” 是 EtherCAT 主站中用于管理和處理從站配置、數據映射和數據…

信息學奧賽一本通 1449:【例題2】魔板

題目 1449&#xff1a;【例題2】魔板 分析 首先注意&#xff1a;輸入是按順時針給出的&#xff0c;但我們處理時需要按正常順序排&#xff0c;可以用以下代碼讀入 string s(8, 0); // 初始化全零字符串 cin>>s[0]>>s[1]>>s[2]>>s[3]; cin>>…