![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5iM1IDNlZmZyEmMhN2M4YjMzUDM4gjZmJDN5UTZmhjNz8CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
1. 前言
上一文(felord.cn)簡單對 java.util.Comparator 進行了說明,今天我們來看看另一個和它非常類似的接口 java.lang.Comparable 。
2. Comparable
Comparable 接口同樣隻有一個抽象方法 int compareTo(T o),其規則和Comparator 的int compare(T o1, T o2)類似。雖然它也可以看作一個函數式接口,但是 Java 8 中并沒有将它标記為函數式接口。說明設計者并不希望開發者将它作為函數式接口來使用。不然就偏離了設計意圖,就像下面輸入一個字元串傳回該字元串的長度。
// 符合文法但是不符合設計意圖的操作Comparable comparable = String::length;
通常情況下Comparable 希望被作為對象的一個特性來表達該對象的執行個體之間是互相比較的。比如電影有按照年份進行比較的特性。
class Movie implements Comparable { private double rating; private String name; private int year; // Used to sort movies by year public int compareTo(Movie m){ return this.year - m.year; } }
Comparable 通常用于自然排序,也就是元素本身是可比較的。
3.Comparator vs Comparable
Comparator 和 Comparable 很相似,但是它們也是有一些不一樣的地方的,主要表現在:
- 視角不同,Comparable 通常是對象自帶的比較屬性而 Comparator 通常是作為“第三方”來比較。
- 通常 Comparable需要被對象實作來作為特性使用,而Comparator 更像是政策。
- 一個位于 java.lang 包下 ,一個在 java.util 下,這從側面也證明了第一條。
4. 總結
總而言之,如果對象的排序需要基于自然順序(它本身是可比較的),則使用 Comparable,而如果需要根據業務來對不同屬性進行排序,請使用 Comparator。