欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中的Comparable接口與Comparator接口區(qū)別解析

 更新時(shí)間:2025年02月12日 10:39:20   作者:八月五  
文章介紹了Java中的Comparable接口和Comparator接口,Comparable接口定義了一個(gè)compareTo方法,用于比較對(duì)象的順序,實(shí)現(xiàn)Comparable接口的類可以提供自然排序規(guī)則,詳細(xì)介紹了Java中的Comparable接口與Comparator接口區(qū)別,感興趣的朋友一起看看吧

一、comparable接口

1.1 接口定義

Comparable 接口定義了一個(gè)方法:

public interface Comparable<T> {
    public int compareTo(T o);
}

compareTo(T o):

  • 參數(shù):o 是另一個(gè)需要比較的對(duì)象,必須與當(dāng)前對(duì)象是相同類型的對(duì)象。
  • 返回值:
    • 如果當(dāng)前對(duì)象小于 o,返回負(fù)整數(shù)。
    • 如果當(dāng)前對(duì)象等于 o,返回零。
    • 如果當(dāng)前對(duì)象大于 o,返回正整數(shù)。
  • 拋出異常:
    • 如果 o 為 null 或與當(dāng)前對(duì)象類型不匹配,拋出 ClassCastException。
    • 如果比較邏輯中出現(xiàn)錯(cuò)誤,拋出 NullPointerException 或其他自定義異常。

1.2 實(shí)現(xiàn) Comparable 接口的意義

  • 自然排序:為類提供默認(rèn)的排序規(guī)則。例如,Integer、Double、String 等類都實(shí)現(xiàn)了 Comparable 接口,分別按照數(shù)值大小和字典順序排序。
  • 集合排序:許多集合類(如 Arrays、Collections、TreeSet、TreeMap 等)依賴 Comparable 接口來對(duì)元素進(jìn)行排序。
    • Arrays.sort() 和 Collections.sort():對(duì)數(shù)組或集合進(jìn)行排序時(shí),會(huì)調(diào)用元素的 compareTo。 方法 - TreeSet 和 TreeMap:基于紅黑樹實(shí)現(xiàn),要求存儲(chǔ)的鍵或元素實(shí)現(xiàn) Comparable 接口,以便維護(hù)有序結(jié)構(gòu)。

1.3 實(shí)現(xiàn)示例

以下是一個(gè)簡(jiǎn)單的示例,展示如何為一個(gè)自定義類實(shí)現(xiàn) Comparable 接口:

import java.util.*;
class Person implements Comparable<Person> {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    @Override
    public int compareTo(Person other) {
        // 按照年齡升序排序
        return Integer.compare(this.age,other.age);
    }
    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}
public class Main {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person("Alice", 30));
        list.add(new Person("Bob", 25));
        list.add(new Person("Charlie", 35));
        Collections.sort(list); // 使用 Comparable 接口的排序規(guī)則
        System.out.println(list);
    }
}

輸出

[Person{name='Bob', age=25}, Person{name='Alice', age=30}, Person{name='Charlie', age=35}]

二、comparator接口

1.1 Comparator 接口簡(jiǎn)介

Comparator 接口位于 java.util 包中,用于定義對(duì)象的比較規(guī)則。它提供了外部排序機(jī)制,允許在不修改對(duì)象本身的情況下,定義多種排序策略。

1.2 接口方法

  • Comparator 接口包含以下方法:
    • int compare(T o1, T o2): 比較兩個(gè)對(duì)象 o1o2 的順序。
    • 返回負(fù)整數(shù)表示 o1 小于 o2,返回零表示 o1 等于 o2,返回正整數(shù)表示 o1 大于 o2。
    • boolean equals(Object obj): 判斷當(dāng)前比較器與指定對(duì)象是否相等。

該方法繼承自 Object 類。

1.3 常用靜態(tài)方法

Comparator 接口提供了一些靜態(tài)方法,用于方便地創(chuàng)建和組合比較器:

  • comparing(Function<T, U> keyExtractor):根據(jù)提供的鍵提取函數(shù)進(jìn)行比較。
  • comparingInt(Function<T, Integer> keyExtractor):針對(duì) int 類型的鍵進(jìn)行比較。
  • comparingLong(Function<T, Long> keyExtractor):針對(duì) long 類型的鍵進(jìn)行比較。
  • comparingDouble(Function<T, Double> keyExtractor):針對(duì) double 類型的鍵進(jìn)行比較。
  • naturalOrder():返回自然順序的比較器。
  • reversedOrder():返回逆序的比較器。
  • reversed():反轉(zhuǎn)現(xiàn)有的比較器。
  • thenComparing(Comparator<? super T> other):在當(dāng)前比較器的基礎(chǔ)上添加次級(jí)比較器。

1.4 使用示例

示例 1:按年齡排序

import java.util.*;
class Person {
    private String name;
    private int age;
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    @Override
    public String toString() {
        return "Person{name='" + name + "', age=" + age + "}";
    }
}
public class Main {
    public static void main(String[] args) {
        List<Person> people = new ArrayList<>();
        people.add(new Person("Alice", 30));
        people.add(new Person("Bob", 25));
        people.add(new Person("Charlie", 35));
        people.sort(Comparator.comparingInt(Person::getAge));
        System.out.println(people);
    }
}

輸出

[Person{name='Bob', age=25}, Person{name='Alice', age=30}, Person{name='Charlie', age=35}]

示例 2:按姓名排序,姓名相同則按年齡排序

people.sort(Comparator.comparing(Person::getName).thenComparingInt(Person::getAge));
System.out.println(people);

1.5 高級(jí)技巧

動(dòng)態(tài)排序規(guī)則

可以通過參數(shù)化的方式動(dòng)態(tài)調(diào)整排序邏輯。例如,根據(jù)升序或降序排序:

public class CustomComparator implements Comparator<Student> {
    private boolean ascending;
    public CustomComparator(boolean ascending) {
        this.ascending = ascending;
    }
    @Override
    public int compare(Student s1, Student s2) {
        int result = Integer.compare(s1.getScore(), s2.getScore());
        return ascending ? result : -result;
    }
}

使用示例:

students.sort(new CustomComparator(true)); // 升序
students.sort(new CustomComparator(false)); // 降序

1.6 線程安全

在多線程環(huán)境下,使用 Comparator 進(jìn)行排序時(shí)需要注意線程安全問題。可以使用Collections.synchronizedList 創(chuàng)建線程安全的列表。

示例

按照字符串長(zhǎng)度升序排序

自定義的類成為了內(nèi)部類,只在當(dāng)前類內(nèi)有效

new Main.test()–>調(diào)用test方法

局部?jī)?nèi)部類:只在當(dāng)前的方法內(nèi)有效

匿名內(nèi)部類:類名消失

三、Comparator 與 Comparable 的區(qū)別

  • Comparable
    • 內(nèi)部排序,適用于類本身具有自然排序邏輯。
    • 比較邏輯固定在類內(nèi)部,靈活性較差。
  • Comparator
    • 外部排序,更靈活,允許根據(jù)需求動(dòng)態(tài)指定或切換排序規(guī)則。
    • 可以為同一個(gè)類定義多個(gè)比較器。
    • 適用于無法修改被比較類的源代碼。
    • 可以臨時(shí)改變對(duì)象的比較順序。

到此這篇關(guān)于Java中的Comparable接口與Comparator接口的文章就介紹到這了,更多相關(guān)Java Comparable接口與Comparator接口內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java Clone深拷貝與淺拷貝的兩種實(shí)現(xiàn)方法

    Java Clone深拷貝與淺拷貝的兩種實(shí)現(xiàn)方法

    今天小編就為大家分享一篇關(guān)于Java Clone深拷貝與淺拷貝的兩種實(shí)現(xiàn)方法,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-10-10
  • java中Filter過濾器處理中文亂碼的方法

    java中Filter過濾器處理中文亂碼的方法

    java中Filter過濾器處理中文亂碼的方法,需要的朋友可以參考一下
    2013-05-05
  • mybatis批量插入返回主鍵失敗的坑及解決

    mybatis批量插入返回主鍵失敗的坑及解決

    這篇文章主要介紹了mybatis批量插入返回主鍵失敗的坑及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Spring中三種常見Bean的初始化參數(shù)機(jī)制你了解嗎

    Spring中三種常見Bean的初始化參數(shù)機(jī)制你了解嗎

    在Spring框架中,Bean的實(shí)例化與初始化是一個(gè)復(fù)雜的過程,本文我們主要來聊一聊它的常見的三種機(jī)制:InitializingBean接口、BeanDefinitionRegistryPostProcessor接口和EnvironmentAware接口,感興趣的小伙伴可以了解下
    2023-11-11
  • SpringCloud中的Ribbon負(fù)載均衡器詳細(xì)解析

    SpringCloud中的Ribbon負(fù)載均衡器詳細(xì)解析

    這篇文章主要介紹了SpringCloud中的Ribbon負(fù)載均衡器詳細(xì)解析,Ribbon 是一個(gè)基于 HTTP 和 TCP 的客戶端負(fù)載均衡工具,它基于 Netflix Ribbon 實(shí)現(xiàn),通過封裝可以讓我們輕松地將面向服務(wù)的 REST 模版請(qǐng)求自動(dòng)轉(zhuǎn)換成客戶端負(fù)載均衡的服務(wù)調(diào)用,需要的朋友可以參考下
    2024-01-01
  • 解析Orika的MapperFacade 屬性賦值的使用問題

    解析Orika的MapperFacade 屬性賦值的使用問題

    在我們實(shí)際開發(fā)中,常常會(huì)有對(duì)象與對(duì)象之間的轉(zhuǎn)化,或者把一個(gè)對(duì)象的數(shù)據(jù)轉(zhuǎn)化到另一個(gè)數(shù)據(jù)之中,如果我們手動(dòng)的一個(gè)一個(gè)的set就會(huì)比較麻煩,代碼段看起來也會(huì)比較長(zhǎng)。而Orika的MapperFacade就是解決這個(gè)問題的,實(shí)現(xiàn)對(duì)象屬性的復(fù)制
    2021-12-12
  • 微服務(wù)之Feign的介紹與使用小結(jié)

    微服務(wù)之Feign的介紹與使用小結(jié)

    Feign 是一個(gè)聲明式的偽RPC的REST客戶端,它用了基于接口的注解方式,很方便的客戶端配置,Spring Cloud 給 Feign 添加了支持Spring MVC注解,并整合Ribbon及Eureka進(jìn)行支持負(fù)載均衡,這篇文章主要介紹了微服務(wù)之Feign的介紹與使用,需要的朋友可以參考下
    2022-07-07
  • SpringBoot2.x 集成騰訊云短信的詳細(xì)流程

    SpringBoot2.x 集成騰訊云短信的詳細(xì)流程

    本文主要對(duì)SpringBoot2.x集成騰訊云短信進(jìn)行簡(jiǎn)單總結(jié),其中SpringBoot使用的2.4.5版本,本文通過業(yè)務(wù)流程圖實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-06-06
  • idea 隱藏target,iml等不需要展示的文件(推薦)

    idea 隱藏target,iml等不需要展示的文件(推薦)

    這篇文章主要介紹了idea 隱藏target,iml等不需要展示的文件,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-11-11
  • JDK動(dòng)態(tài)代理過程原理及手寫實(shí)現(xiàn)詳解

    JDK動(dòng)態(tài)代理過程原理及手寫實(shí)現(xiàn)詳解

    這篇文章主要為大家介紹了JDK動(dòng)態(tài)代理過程原理及手寫實(shí)現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09

最新評(píng)論