Java Comparable和Comparator对比详解

 更新时间:2019年11月07日 09:08:51   作者:Demrystv  
这篇文章主要介绍了Java Comparable和Comparator对比详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

在实际项目开发过程中,我们经常需要对某个对象或者某个集合中的元素进行排序,常用的两种方式是实现某个接口。常见的可以实现比较功能的接口有Comparable接口和 Comparator接口,那么这两个又有什么区别呢?

关于Comparable接口

关于Comparable接口,其位于 java.lang.Comparable 中,实现这个接口,可以通过重写其 compareTo 方法进行自定义排序,一般用于实体类中,比如针对学生对象,根据其姓名、身高、年龄、地址等进行排序,商品根据名称、库存、价格排序等。下面一段代码中主要是对 学生的姓名、年龄、地址进行排序,当我们重写其 compareTo 方法后,对于一个学生对象的集合,我们可以通过调用 Collections.sort(studentList) 对其进行排序,即可达到想要的效果。

public class Students implements Comparable<Students> {

  private String name;
  private int age;
  private String address;

  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 getAddress() {
    return address;
  }

  public void setAddress(String address) {
    this.address = address;
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("姓名:").append(this.name);
    sb.append("年龄:").append(this.age);
    sb.append("地址:").append(this.address);
    return sb.toString();

  }

  // 重写排序方法,先根据年龄升序,再根据姓名降序,最后根据地址升序
  @Override
  public int compareTo(Students o) {
    int result= 0;
    result = this.age - o.getAge();
    if (0 == result){
      result = o.getName().compareTo(this.getName());
      if (0 == result){
        result = this.getAddress().compareTo(o.getAddress());
      }
    }
    return result;
  }
}

关于Comparator接口

关于Comparator接口,其位于 java.util.Comparator 中,实现这个接口,可以通过重写其 compare 方法进行自定义的排序,比如针对 字符串的 list,根据其长度递减排序;根据Integer 的集合,根据其大小升序(Collections.sort()方法中默认实现的就是升序)。此外,针对数组的排序,还可以调用 Arrays.sort() 进行排序,其默认是根据字典顺序进行排序。

import java.util.*;

public class CompareController1 implements Comparator<Integer> {
  @Override
  public int compare(Integer o1, Integer o2) {
//    int length1 = o1.length();
//    int length2 = o2.length();
    return o2 - o1;  //按照降序排列
  }

  public static void main(String[] args) {
    List<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(23);
    list.add(400);
    list.add(222);
    list.add(34);

    Collections.sort(list,new CompareController1());
    System.out.println(list.toString());

    Object[] objects = list.toArray();
    // 针对String类型,默认是按照字典表进行排序
    // 针对 int 类型,默认是 按照 升序 进行排序
    Arrays.sort(objects);
    //不能直接打印数组,那样打印出来的是地址,可以使用 foreach
    System.out.println(Arrays.toString(objects));

  }
}

扩展补充:

关于Collections.sort()和 Arrays.sort()

1) Collections.sort()方法底层实际就是Arrays.sort(),

2) Arrays.sort()的底层分为两种,满足某种条件就调用这个排序 legacyMergeSort,其底层就是归并排序;如果不满足,就是 TimSort

3) TimSort 的底层根据数组的长度进行区分,如果数组的长度小于32,直接使用简单的合并算法,即二分插入排序(binary merge sort);如果长度大于32,就是 合并算法。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java实现红黑树(平衡二叉树)的详细过程

    Java实现红黑树(平衡二叉树)的详细过程

    红黑树接近平衡的二叉树,插入,删除函数跟平衡二叉树一样,只是平衡函数不同,下面这篇文章主要给大家介绍了关于Java实现红黑树(平衡二叉树)的相关资料,需要的朋友可以参考下
    2021-10-10
  • Java多线程并发FutureTask使用详解

    Java多线程并发FutureTask使用详解

    Java 的多线程机制本质上能够完成两件事情,异步计算和并发,FutureTask 是基于 Runnable 实现的一个可取消的异步调用 API,本文给大家介绍Java 多线程并发FutureTask及基本使用,需要的朋友可以参考下
    2022-06-06
  • 手动模拟JDK动态代理的方法

    手动模拟JDK动态代理的方法

    这篇文章主要介绍了手动模拟JDK动态代理的方法,帮助大家更好的了解和学习Java 代理的相关知识,感兴趣的朋友可以了解下
    2020-11-11
  • SpringCloud网关组件zuul实例解析

    SpringCloud网关组件zuul实例解析

    这篇文章主要介绍了SpringCloud网关组件zuul实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • Java如何基于IO流实现同一文件读写操作

    Java如何基于IO流实现同一文件读写操作

    这篇文章主要介绍了Java如何基于IO流实现文件读写操作,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • servlet生命周期_动力节点Java学院整理

    servlet生命周期_动力节点Java学院整理

    这篇文章主要为大家详细介绍了servlet生命周期的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • Java非侵入式API接口文档工具apigcc用法详解

    Java非侵入式API接口文档工具apigcc用法详解

    这篇文章主要介绍了Java非侵入式API接口文档工具apigcc用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • SpringBoot项目热部署的实现

    SpringBoot项目热部署的实现

    SpringBoot项目热部署是一种让开发人员在修改代码后无需重启应用即可看到更改效果的技术,通过使用SpringBoot的DevTools等工具,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-09-09
  • Spring MVC使用jstl 标签c:forEach 遍历输出双层嵌套List的数据方式

    Spring MVC使用jstl 标签c:forEach 遍历输出双层嵌套List的数据方式

    这篇文章主要介绍了Spring MVC使用jstl 标签c:forEach 遍历输出双层嵌套List的数据方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 浅谈IDEA实用的Servlet模板

    浅谈IDEA实用的Servlet模板

    今天给大家分享一下IDEA实用的Servlet模板,文中有非常详细的图文介绍及代码示例,对小伙伴们很有帮助哦,需要的朋友可以参考下
    2021-05-05

最新评论