Java 中的 Comparable 接口

简介: Java 中的 Comparable 接口

为何需要实现Comparable接口


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

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

下面是1个简单例子

public class Compare1{
    public static void f(){
        ArrayList arr = new ArrayList();
        arr.add(10);
        arr.add(23);
        arr.add(7);
        System.out.println(arr);
        Collections.sort(arr);
        System.out.println(arr);
    } 
}

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

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

[java] [10, 23, 7]  
[java] [7, 10, 23]

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

例子:

import java.util.ArrayList;
import java.util.Collections;
class Student{
    private String name;
    private int ranking;
    public Student(String name, int ranking){
        this.name = name;
        this.ranking = ranking;
    } 
    public String toString(){
        return this.name + ":" + this.ranking;
    }
}
public class Compare2{
    public static void f(){
        ArrayList arr = new ArrayList();
        arr.add(new Student("Jack",10));
        arr.add(new Student("Bill",23));
        arr.add(new Student("Rudy",7));
        System.out.println(arr);
    } 
}

上面定义了1个Student类, 它只有两个成员, 名字和排名.

在f()方法内, 添加3个Student的对象到1个list容器中, 然后输出

[Jack:10, Bill:23, Rudy:7]

到此为止, 是没有问题的.  但是当对这个容器进行排序时就有问题了.

例如将上面的f()方法改成:

public class Compare2{
    public static void f(){
        ArrayList arr = new ArrayList();
        arr.add(new Student("Jack",10));
        arr.add(new Student("Bill",23));
        arr.add(new Student("Rudy",7));
        System.out.println(arr);
        Collections.sort(arr);
        System.out.println(arr);
    } 
}

编译时就会出错:

提示这个类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排位上是相等的

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

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


Comparable接口的实现及用法.


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

import java.util.ArrayList;
import java.util.Collections;
class Student implements Comparable{
    private String name;
    private int ranking;
    public Student(String name, int ranking){
        this.name = name;
        this.ranking = ranking;
    } 
    public String toString(){
        return this.name + ":" + this.ranking;
    }
    public int compareTo(Object o){
        Student s = (Student)(o);
        return this.ranking - s.ranking;
    }
}
public class Compare2{
    public static void f(){
        ArrayList arr = new ArrayList();
        arr.add(new Student("Jack",10));
        arr.add(new Student("Bill",23));
        arr.add(new Student("Rudy",7));
        System.out.println(arr);
        Collections.sort(arr);
        System.out.println(arr);
    } 
}

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

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

输出:

[java] [Jack:10, Bill:23, Rudy:7]
[java] [Rudy:7, Jack:10, Bill:23]


目录
相关文章
|
5天前
|
Java 开发者
探索 Java 的函数式接口和 Lambda 表达式
【4月更文挑战第19天】Java 中的函数式接口和 Lambda 表达式提供了简洁、灵活的编程方式。函数式接口有且仅有一个抽象方法,用于与 Lambda(一种匿名函数语法)配合,简化代码并增强可读性。Lambda 表达式的优点在于其简洁性和灵活性,常用于事件处理、过滤和排序等场景。使用时注意兼容性和变量作用域,它们能提高代码效率和可维护性。
|
6天前
|
Java
Java接口中可以定义哪些方法?
【4月更文挑战第13天】
9 0
Java接口中可以定义哪些方法?
|
8天前
|
设计模式 Java
Java接口与抽象类
Java接口与抽象类
17 0
|
12天前
|
安全 Java 编译器
接口之美,内部之妙:深入解析Java的接口与内部类
接口之美,内部之妙:深入解析Java的接口与内部类
34 0
接口之美,内部之妙:深入解析Java的接口与内部类
|
14天前
|
存储 Java
java接口和内部类
java接口和内部类
|
16天前
|
缓存 安全 Java
Java中函数式接口详解
Java 8引入函数式接口,支持函数式编程。这些接口有单一抽象方法,可与Lambda表达式结合,简化代码。常见函数式接口包括:`Function&lt;T, R&gt;`用于转换操作,`Predicate&lt;T&gt;`用于布尔判断,`Consumer&lt;T&gt;`用于消费输入,`Supplier&lt;T&gt;`用于无参生成结果。开发者也可自定义函数式接口。Lambda表达式使实现接口更简洁。注意异常处理和线程安全。函数式接口广泛应用于集合操作、并行编程和事件处理。提升代码可读性和效率,是现代Java开发的重要工具。
29 0
|
16天前
|
Java 关系型数据库 MySQL
大厂面试题详解:Java抽象类与接口的概念及区别
字节跳动大厂面试题详解:Java抽象类与接口的概念及区别
40 0
|
16天前
|
Java
Java中的多线程实现:使用Thread类与Runnable接口
【4月更文挑战第8天】本文将详细介绍Java中实现多线程的两种方法:使用Thread类和实现Runnable接口。我们将通过实例代码展示如何创建和管理线程,以及如何处理线程同步问题。最后,我们将比较这两种方法的优缺点,以帮助读者在实际开发中选择合适的多线程实现方式。
22 4
|
18天前
|
Java
在Java中,定义一个接口的步骤如下
【4月更文挑战第6天】在Java中,定义一个接口的步骤如下
5 1
|
1月前
|
Java
【Java】Clonable 接口
【Java】Clonable 接口
11 1