• Java 中 Comparable 接口的作用


    一, 为何需要实现Comparable接口

    我们知道Collections类中包含很多对实现Collection接口的容器各种操作的静态方法.

    当然, 其中最长用的莫过于排序了(Collections.sort(List l).

    逻辑很简单, 就是在1个list容器中添加3个int数值(注意实际被自动装箱成Interger对象).

    正常输出容器元素一次, 利用Collections.sort()方法排序后, 再输出1次.

    1. public class Compare1{
    2. public static void f(){
    3. ArrayList arr = new ArrayList();
    4. arr.add(10);
    5. arr.add(23);
    6. arr.add(7);
    7. System.out.println(arr);
    8. Collections.sort(arr);
    9. System.out.println(arr);
    10. }
    11. }

    输出: 

    1. [java] [10, 23, 7]
    2. [java] [7, 10, 23]

    但是当List容器添加的元素对象是属于自己写的类时, 就可能出问题了.

    1. import java.util.ArrayList;
    2. import java.util.Collections;
    3. class Student{
    4. private String name;
    5. private int ranking;
    6. public Student(String name, int ranking){
    7. this.name = name;
    8. this.ranking = ranking;
    9. }
    10. public String toString(){
    11. return this.name + ":" + this.ranking;
    12. }
    13. }
    14. public class Compare2{
    15. public static void f(){
    16. ArrayList arr = new ArrayList();
    17. arr.add(new Student("zhangsan",20));
    18. arr.add(new Student("lisi",23));
    19. arr.add(new Student("wangwu",17));
    20. System.out.println(arr);
    21. Collections.sort(arr);
    22. System.out.println(arr);
    23. }
    24. }

    编译时就会报错:

     [java] Caused by: java.lang.ClassCastException: Collection_kng.Comparable_kng.Student cannot be cast to java.lang.Comparable

    提示这个类Student没有实现Comparable接口.
    原因也很简单, 因为Java不知道应该怎样为Student对象排序, 是应该按名字排序? 还是按ranking来排序?
    为什么本文第1个例子就排序成功? 是因为Java本身提供的类Integer已经实现了Comparable接口. 也表明Integer这个类的对象是可以比较的.
    而Student类的对象默认是不可以比较的.  除非它实现了Comparable接口.
    总而言之,  如果你想1个类的对象支持比较(排序), 就必须实现Comparable接口.

    二, Comparable接口简介.

    Comparable 接口内部只有1个要重写的关键的方法.就是int compareTo(T o)这个方法返回1个Int数值,  例如 i = x.compareTo(y)

    如果i=0, 也表明对象x与y排位上是相等的(并非意味x.equals(y) = true, 但是jdk api上强烈建议这样处理)

    如果返回数值i>0 则意味者, x > y啦, 

    反之若i<0则 意味x < y


    三, Comparable接口的实现及用法.


    用回上面的例子, 我们修改Student类, 令其实现Comparable接口并重写compareTo方法.

    注意重写的compareTo(Object o)方法内.  根据Student的ranking成员来比较的, 也就是说跟姓名无关了.

    这时再编译执行, 就能见到List容器内的Student对象已经根据ranking来排序了

    1. import java.util.ArrayList;
    2. import java.util.Collections;
    3. class Student implements Comparable{
    4. private String name;
    5. private int ranking;
    6. public Student(String name, int ranking){
    7. this.name = name;
    8. this.ranking = ranking;
    9. }
    10. public String toString(){
    11. return this.name + ":" + this.ranking;
    12. }
    13. public int compareTo(Object o){
    14. Student s = (Student)(o);
    15. return this.ranking - s.ranking;
    16. }
    17. }
    18. public class Compare2{
    19. public static void f(){
    20. ArrayList arr = new ArrayList();
    21. arr.add(new Student("zhangsan",20));
    22. arr.add(new Student("lisi",23));
    23. arr.add(new Student("wangwu",17));
    24. System.out.println(arr);
    25. Collections.sort(arr);
    26. System.out.println(arr);
    27. }
    28. }

    输出:

    1. [java] [zhangsan:20, lisi:23, wangwu:17]
    2. [java] [wangwu:17, zhangsan:20, lisi:23]

  • 相关阅读:
    Python机器视觉--OpenCV入门--视频的加载,录制
    数商云DMS渠道商城系统全渠道营销场景应用举例,赋能日化行业增强渠道掌控力
    kubernetes集群编排——istio
    小试牛刀Linux信号
    通过T-DIAG指令对S7通信或TCP通信进行连接状态诊断的具体方法示例
    《C++避坑神器·二十一》回调函数使用
    电子邮件解决方案有哪些?邮件系统的问题?
    Android性能优化,有关内存抖动与解决方案
    PWA 应用 Service Worker 缓存的一些可选策略和使用场景
    【JUC系列-11】深入理解LinkedBlockingQueue的底层实现
  • 原文地址:https://blog.csdn.net/weixin_52793468/article/details/132901759