# Java `Comparable`接口示例

> 原文： [https://howtodoinjava.com/java/collections/java-comparable-interface/](https://howtodoinjava.com/java/collections/java-comparable-interface/)

Java `Comparable`接口，用于根据对象的**自然顺序**对对象的[数组](https://howtodoinjava.com/java-array/)或[列表](https://howtodoinjava.com/java-arraylist/)进行排序。 元素的自然排序是通过在对象中实现`compareTo()`方法来实现的。

## 1\. Java `Comparable`接口

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

```

Java `Comparable`接口对实现它的每个类的对象强加了总体排序。 此排序称为类的**自然排序**，而该类的`compareTo()`方法也称为其自然比较方法。

使用`Comparable`接口，我们可以对以下元素进行排序：

1.  字符串对象
2.  包装器类对象，例如`Integer`，`Long`等
3.  用户定义的自定义对象

#### 1.1 `compareTo()`方法

对于任何支持自然排序的类，它都应实现`Comparable`接口并覆盖其`compareTo()`方法。 它必须返回负整数，零或正整数，因为此对象小于，等于或大于指定的对象。

请注意，如果`y.compareTo(x)`引发异常，则方法必须引发异常。 关系也必须是**可传递**，即（`x.compareTo(y) > 0 && y.compareTo(z) > 0`）表示`x.compareTo(z)> 0`。

例如，对于`Employee`类，自然排序可以基于其员工`id`。

```java
import java.time.LocalDate;

public class Employee implements Comparable<Employee> {

    private Long id;
    private String name;
    private LocalDate dob;

    @Override
    public int compareTo(Employee o) 
    {
        return this.getId().compareTo( o.getId() );
    }
}

```

所有包装器类和`String`类都实现`Comparable`接口。 [包装器类](https://howtodoinjava.com/java/basics/java-wrapper-classes/)通过它们的值进行比较，字符串在字典上进行比较。

#### 1.2 `Collections.sort()`和`Arrays.sort()`

1.  使用`Collections.sort()`方法对对象的**列表**进行排序。
2.  使用`Arrays.sort()`方法对对象的**数组**进行排序。

#### 1.3 `Collections.reverseOrder()`

此工具方法返回一个`Comparator`，它在实现`Comparable`接口的对象集合上强加*自然顺序*的逆序。

这为排序（或维护）以**反自然顺序**实现`Comparable`接口的对象的集合（或数组）提供了一个简单的习惯用法。

## 2\. Java `Comparable`示例

所有给定的示例都使用`Collections.sort()`方法对列表进行排序。 如果我们需要对相同对象的数组进行排序，只需将 `Collections.sort()`替换为`Arrays.sort()`。

#### 2.1 排序字符串列表

Java 程序使用`Comparable`接口对字符串列表进行排序。

```java
ArrayList<String> list = new ArrayList<>();

list.add("E");
list.add("A");
list.add("C");
list.add("B");
list.add("D");

Collections.sort(list);

System.out.println(list);

```

程序输出。

```java
[A, B, C, D, E]

```

#### 2.2 以相反的顺序对字符串列表进行排序

Java 程序使用`Comparable`接口对字符串列表进行排序。

```java
ArrayList<String> list = new ArrayList<>();

list.add("E");
list.add("A");
list.add("C");
list.add("B");
list.add("D");

//Sort in reverse natural order
Collections.sort(list, Collections.reverseOrder());

System.out.println(list);

```

程序输出：

```java
[E, D, C, B, A]

```

#### 2.3 排序整数列表

Java 程序使用`Comparable`接口对整数列表进行排序。

```java
ArrayList<Integer> list = new ArrayList<>();

list.add(10);
list.add(300);
list.add(45);
list.add(2);
list.add(5);

//Natural order
Collections.sort(list);

System.out.println(list);

//Sort in reverse natural order
Collections.sort(list, Collections.reverseOrder());

System.out.println(list);

```

程序输出：

```java
[2, 5, 10, 45, 300]
[300, 45, 10, 5, 2]

```

#### 2.4 排序员工名单

Java 程序使用`Comparable`接口对自定义对象列表进行排序。 在此示例中，我们将**按 ID** 排序员工列表。

```java
ArrayList<Employee> list = new ArrayList<>();

list.add(new Employee(22l, "Lokesh", LocalDate.now()));
list.add(new Employee(18l, "Alex", LocalDate.now()));
list.add(new Employee(30l, "Bob", LocalDate.now()));
list.add(new Employee(600l, "Charles", LocalDate.now()));
list.add(new Employee(5l, "David", LocalDate.now()));

//Natural order
Collections.sort(list);

System.out.println(list);

//Sort in reverse natural order
Collections.sort(list, Collections.reverseOrder());

System.out.println(list);

```

程序输出：

```java
[
	Employee [id=5, name=David, dob=2018-10-29], 
	Employee [id=18, name=Alex, dob=2018-10-29], 
	Employee [id=22, name=Lokesh, dob=2018-10-29], 
	Employee [id=30, name=Bob, dob=2018-10-29], 
	Employee [id=600, name=Charles, dob=2018-10-29]
]

//Reverse sorted

[
	Employee [id=600, name=Charles, dob=2018-10-30], 
	Employee [id=30, name=Bob, dob=2018-10-30], 
	Employee [id=22, name=Lokesh, dob=2018-10-30], 
	Employee [id=18, name=Alex, dob=2018-10-30], 
	Employee [id=5, name=David, dob=2018-10-30]
]

```

## 3\. 总结

在本教程中，我们学习了 Java 集合框架的`Comparable`接口。 它有助于通过简单的接口实现对对象施加自然顺序。

我们学习了对字符串列表，字符串数组，整数列表，整数数组进行排序，并学习了如何使用可比性对 Java 中的员工对象进行排序。

将我的问题放在评论部分。

学习愉快！

参考文献：

[`Comparable`接口 Java 文档](https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html)