首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java TreeSet 定制排序疑問:Comparator 匿名內部類為何只需實現 compare 方法?

     編輯:程式設計疑難解答

接口定義

@FunctionalInterface
public interface Comparator {
    int compare(T o1, T o2);           // 必須實現
    boolean equals(Object obj);        // 默認方法(繼承自 Object)
    // ... 其他默認/靜態方法
}

為什麼只實現 compare?

  1. 函數式接口:只有一個抽象方法 compare,Lambda/匿名類只需實現該方法。
  2. equals 非強制:equals 繼承自 Object,默認比較引用地址。Comparator 契約要求:若 compare(o1,o2)==0 則 equals(o1,o2) 應為 true,但不強制覆寫,框架不依賴它進行排序。
  3. 排序邏輯:TreeSet 僅調用 compare 判斷元素大小關係(<0, =0, >0),構建紅黑樹。

代碼示例

TreeSet ts = new TreeSet<>(new Comparator() {
    @Override
    public int compare(R o1, R o2) {
        return Integer.compare(o2.count, o1.count); // 降序
    }
    // equals 可不寫
});

補充:Comparable vs Comparator

接口位置用途
Comparable元素類內部自然順序(如 String、Integer 默認升序)
Comparator外部類/匿名類定制順序、多種排序策略共存

結論

TreeSet 構造器傳入 Comparator 時,只需實現 compare 方法;equals 方法用於外部比較兩個 Comparator 實例是否相等,不參與排序決策。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved