Java语言的Comparable和Comparator区别

 更新时间:2023年06月19日 10:51:33   作者:叶晨烁  
这篇文章主要介绍了Java语言的Comparable和Comparator区别,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

Java的Comparable和Comparator

当我们使用自定义 Java 对象执行比较时,我们可以使用ComparableComparator接口。

1.Java可比对象

Comparable接口对实现它的每个类的对象强加了总体排序。 此排序称为类的自然排序。 该类的compareTo()方法必须实现以提供自然的比较。

2.Java比较器

Comparator接口对某些对象集合强加了整体排序。 可以将比较器传递给排序方法(例如Collections.sort()Arrays.sort()),以实现对排序顺序的精确控制。 比较器还可以用于控制某些数据结构(例如排序集或排序映射)的顺序,或为没有自然顺序的对象集合提供排序。

3.可比对象和比较器

  • Java可比对象

    • 必须定义o1.compareTo(o2)
    • 用于实现对象的自然排序
    • 我们必须修改要对其实例进行排序的类
    • 在同一班
    • 只有一种实现
    • 在 API 中经常通过以下方式实现:字符串,包装类,日期,日历
  • Java比较器

    • 必须定义compare(o1, o2)
    • 比较类型的两个实例的多种方法-例如 按年龄,姓名比较人
    • 我们可以为我们无法控制的类提供比较器
    • 我们可以有多个比较器的实现
    • 旨在实现对第三方类实例的排序

4.Java内置比较器示例

public class JavaBuiltInComparator {
    public static void main(String[] args) {
        List<String> words = new ArrayList<>();
        words.add("dog");
        words.add("pen");
        words.add("sky");
        words.add("rock");
        words.add("den");
        words.add("fountain");
        words.sort(Comparator.naturalOrder());
        words.forEach(System.out::println);
        words.sort(Comparator.reverseOrder());
        words.forEach(System.out::println);
    }
}

Comparator.naturalOrder()返回内置的自然顺序Comparator

words.sort(Comparator.naturalOrder());

Comparator.reverseOrder()返回一个比较器,该比较器强加自然顺序。

words.sort(Comparator.reverseOrder());

Comparator.comparingInt()方法从提供的类型中提取 int 排序键,并通过该键进行比较。

class Person {
    private String name;
    private int age;
    public String getName() {
        return name;
    }
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }
    public void setAge(int age) {
        this.age = age;
    };
    public int getAge() {
        return this.age;
    }
    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Person{");
        sb.append("name='").append(name).append('\'');
        sb.append(", age=").append(age);
        sb.append('}');
        return sb.toString();
    }
}
public class JavaBuiltInComparator2 {
    public static void main(String[] args) {
        Person p1 = new Person("Robert", 23);
        Person p2 = new Person("Monika", 18);
        Person p3 = new Person("Tom", 37);
        Person p4 = new Person("Elisabeth", 31);
        List<Person> vals = Arrays.asList( p1, p2, p3, p4 );
        vals.sort(Comparator.comparingInt(Person::getAge));
        vals.forEach(System.out::println);
    }
}

5.多个比较器

通过Comparator.thenComparing()方法,我们可以在对对象进行排序时使用多个比较器。

class Person {
    private String name;
    private int age;
    private String city;
    public Person(String name, int age, String city) {
        this.name = name;
        this.age = age;
        this.city = city;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getCity() {
        return city;
    }
    public void setCity(String city) {
        this.city = city;
    }
    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("Person{");
        sb.append("name='").append(name).append('\'');
        sb.append(", age=").append(age);
        sb.append(", city='").append(city).append('\'');
        sb.append('}');
        return sb.toString();
    }
}
public class JavaMultipleComparatorsEx {
    public static void main(String[] args) {
        List<Person> persons = Arrays.asList(
                new Person("Peter", 23, "New York"),
                new Person("Sarah", 13, "Las Vegas"),
                new Person("Lucy", 33, "Toronto"),
                new Person("Sarah", 21, "New York"),
                new Person("Tom", 18, "Toronto"),
                new Person("Robert", 23, "San Diego"),
                new Person("Lucy", 23, "Los Angeles"),
                new Person("Sam", 36, "Dallas"),
                new Person("Elisabeth", 31, "New York"),
                new Person("Ruth", 29, "New York"),
                new Person("Sarah", 41, "New York")
        );
        persons.sort(Comparator.comparing(Person::getName)
                .thenComparing(Person::getCity)
                .thenComparing(Person::getAge));
        persons.forEach(System.out::println);
    }
}

先按对象名称比较对象,然后按城市比较对象,最后按年龄比较对象。

persons.sort(Comparator.comparing(Person::getName)
        .thenComparing(Person::getCity)
        .thenComparing(Person::getAge));

6.Java自定义比较器

public class JavaCustomComparatorEx {
    public static void main(String[] args) {
        List<String> words = Arrays.asList("pen", "blue", "atom", "to",
                "ecclesiastical", "abbey", "car", "ten", "desk", "slim",
                "journey", "forest", "landscape", "achievement", "Antarctica");
        words.sort((e1, e2) -> e1.length() - e2.length());
        words.forEach(System.out::println);
        words.sort((e1, e2) ->  e2.length() - e1.length() );
        words.forEach(System.out::println);
    }
}

有一个单词表。 根据单词的长度对其进行比较。

words.sort((e1, e2) -> e1.length() - e2.length());

这个自定义比较器用于按单词的大小按升序对单词进行排序。

words.sort((e1, e2) ->  e2.length() - e1.length() );

到此这篇关于Java语言的Comparable和Comparator区别的文章就介绍到这了,更多相关JavaComparable和Comparator区别内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解spring cloud分布式日志链路跟踪

    详解spring cloud分布式日志链路跟踪

    这篇文章主要介绍了详解spring cloud分布式日志链路跟踪,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • SpringBoot接收LocalDateTime参数的方式

    SpringBoot接收LocalDateTime参数的方式

    这篇文章主要介绍了SpringBoot接收LocalDateTime参数的方式,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧
    2024-08-08
  • 教你怎么用Java通过关键字修改pdf

    教你怎么用Java通过关键字修改pdf

    此方法只适合通过关键字位置,在pdf上添加字符直接上代码,代码比较长,大部分自己的理解都在代码注释中了,需要的朋友可以参考下
    2021-05-05
  • RestTemplate().postForEntity的参数使用及说明

    RestTemplate().postForEntity的参数使用及说明

    `RestTemplate().postForEntity()`是SpringFramework中用于发送HTTP POST请求并获取响应的方法,该方法接受目标URL、请求体、期望的响应类型以及可选的变量参数,并返回一个包含HTTP响应信息的`ResponseEntity`对象
    2025-12-12
  • 一文精通Java 多线程之全方位解读

    一文精通Java 多线程之全方位解读

    Java 给多线程编程提供了内置的支持。 一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务,多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销
    2021-10-10
  • Java基于动态规划法实现求最长公共子序列及最长公共子字符串示例

    Java基于动态规划法实现求最长公共子序列及最长公共子字符串示例

    这篇文章主要介绍了Java基于动态规划法实现求最长公共子序列及最长公共子字符串,简单描述了动态规划法的概念、原理,并结合实例形式分析了Java使用动态规划法求最长公共子序列以及最长公共子字符串相关实现技巧,需要的朋友可以参考下
    2018-08-08
  • 基于springEL表达式详解及应用

    基于springEL表达式详解及应用

    这篇文章主要介绍了springEL表达式详解及应用,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • mybatisPlus 大于小于的实现示例

    mybatisPlus 大于小于的实现示例

    在 MyBatis Plus 中进行条件查询,使用小于等于,大于等于操作可以通过其提供的条件构造器(Wrapper)来实现,下面就来详细的介绍一下mybatisPlus 大于小于的实现示例,感兴趣的可以了解一下
    2025-12-12
  • 详解如何实现OpenAPI开发动态处理接口的返回数据

    详解如何实现OpenAPI开发动态处理接口的返回数据

    这篇文章主要为大家介绍了OpenAPI开发动态处理接口的返回数据如何实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java延时任务实现方案及四大典型场景详解(适用于Spring Boot3)

    Java延时任务实现方案及四大典型场景详解(适用于Spring Boot3)

    在Java编程中,延时函数是一种常用的技术,用于在程序执行过程中暂停一段时间,这篇文章主要介绍了Java延时任务实现方案及四大典型场景(适用于SpringBoot3)的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2026-05-05

最新评论