概要:Comparable


java.langインタフェースComparable
まず、公式APIを見てみましょう.
このインタフェースは、実装された各クラスのオブジェクトを強制的に並べ替えます.このソートをクラスの自然ソートと呼び,クラスのcompareToメソッドをその自然比較メソッドと呼ぶ.
このインタフェースを実装するオブジェクトのリスト(および配列)は、Collections.sort(およびArrays.sort)によって自動的にソートできます.このインタフェースを実装するオブジェクトは、比較器を指定することなく、順序マッピングのキーまたは順序セットの要素として使用できます.
クラスCの各e 1およびe 2については、e 1のみである.compareTo(e 2)==0とe 1.equals(e 2)が同じboolean値を持つ場合,クラスCの自然ソートはequalsと一致する.nullはクラスのインスタンスではありません.e.equals(null)がfalseを返しても、e.compareTo(null)はNullPointerExceptionを放出します.
必須ではないが、自然ソートをequalsと一致させることを推奨します.これは、自然ソートがequalsと一致しない要素(またはキー)を使用する場合、明示的な比較器のない秩序化された集合(および秩序化マッピングテーブル)の動作が「奇妙」を示すためです.特に、このような秩序化された集合(または秩序化マッピングテーブル)はequalsメソッドによって定義された集合に反します.(またはマッピングテーブル)の一般的な協定.
たとえば、明示的な比較器を使用しない秩序化された集合に2つのキーaおよびbを追加し、(!a.equals(b)&&a.compareTo(b)==0)とすると、2番目のadd操作は、秩序化された集合の角度からaおよびbが等しいためfalse(秩序化された集合のサイズが増加していない)を返す.
実際,Comparableを実装するJavaコアクラスはすべてequalsと一致する自然ソートを持つ. java.math.BigDecimalは例外で、値が等しいが精度が異なるBigDecimalオブジェクト(4.0や4.00など)を自然なソートで同等と見なします.
数学的には,与えられたクラスC上の自然並べ替えを定義する関係式は,{(x,y)|x.compareTo(y)<=0}である.全体の順位付けは、{(x,y)|x.compareTo(y)==0}です.それは直接compareToの協定に従って、商はCの等価関係で、自然な順序はCの全体の順序です.クラスの自然並べ替えがequalsと一致するといえば,自然並べ替えの商がクラスのequals(Object)メソッドによって定義される等価関係を指す.{(x, y)|x.equals(y)}.
以下は個人的な理解ですが、理解が不十分な場合は軽く撮ってください.
  • 単純使用
  • //  
    Student[] stu = {new Student(1,"1"),new Student(3,"3"),new Student(2,"2")};
    Arrays.sort(stu);
    for (Student ss : stu){
        System.out.println(ss);
    }
    System.out.println("-------     -------");
    //  
    List list  = new ArrayList<>();
    list.add(new Student(1,"1"));
    list.add(new Student(3,"3"));
    list.add(new Student(2,"2"));
    list.sort(null);
    //   Collections.sort(list);
    for (int i = 0; i < list.size(); i++) {
        System.out.println(list.get(i));
    }
    
    //         ,   Comparable   
    public class Student implements Comparable<Student>{
    
        @Override
        public int compareTo(Student o) {
            return this.getId() - o.getId();
        }
    }