这段代码,为什么用TreeSet自然排序后,和用HashSet呈现不一样的结果

我的理解是:TreeSet可以进行自定义排序,但是内容应该和选用HashSet是一样的。但是结果是:使用TreeSet打印集合少了一个(我认为少了个元素[student 2020124 is 19 years old])。是不是和我写的compareTo方法有关系?

使用HashSet:

import java.util.HashSet;
import java.util.TreeSet;

class testTre{
    public int age;
    public final String id;
    public testTre(String id, int age){
        this.id = id;
        this.age = age;
    }
    @Override
    public String toString(){
        return "[student " + this.id + " is "+ this.age + " years old]";
    }
//    @Override
//    public int compareTo(Object obj){      //  自然排序
//        testTre temp = (testTre) obj;
////        if(this.age < temp.age)
////            return -1;
////        else
////            return 1;
//        if(temp.age == this.age)
//            System.out.println("相同");
//        return this.age > temp.age ? 1 : this.age < temp.age ? -1 : 0;
//    }
    @Override
    public boolean equals(Object obj){
        if(this == obj){   // 判断是否为同一个对象,即自己与自己比较
            return true;
        }
        else if( obj != null && obj.getClass() == testTre.class){  // 判断两个对象是否出自同一个(运行时)类
            testTre temp = (testTre) obj; // 强制类型转换
            return temp.id == this.id;
        }
        return false;
    }
    @Override
    public int hashCode(){
        return Integer.valueOf(this.id).intValue();
    }
}
public class Treeset {
    public static void main(String[] args){
        HashSet Ts = new HashSet();
        Ts.add(new testTre("2020106",12));
        Ts.add(new testTre("2020108",19));
        Ts.add(new testTre("2020208",15));
        Ts.add(new testTre("2020104",22));
        Ts.add(new testTre("2020124",19));
        Ts.add(new testTre("2020124",19));

        System.out.println(Ts);
    }
}
// HashSet:
//[[student 2020108 is 19 years old], [student 2020124 is 19 years old],
// [student 2020106 is 12 years old], [student 2020104 is 22 years old],
// [student 2020208 is 15 years old]]

使用TreeSet:

import java.util.HashSet;
import java.util.TreeSet;

class testTre implements Comparable{
    public int age;
    public final String id;
    public testTre(String id, int age){
        this.id = id;
        this.age = age;
    }
    @Override
    public String toString(){
        return "[student " + this.id + " is "+ this.age + " years old]";
    }
    @Override
    public int compareTo(Object obj){      //  自然排序
        testTre temp = (testTre) obj;
//        if(this.age < temp.age)
//            return -1;
//        else
//            return 1;
//        if(temp.age == this.age)
//            System.out.println("相同");
        return this.age > temp.age ? 1 : this.age < temp.age ? -1 : 0;
    }
    @Override
    public boolean equals(Object obj){
        if(this == obj){   // 判断是否为同一个对象,即自己与自己比较
            return true;
        }
        else if( obj != null && obj.getClass() == testTre.class){  // 判断两个对象是否出自同一个(运行时)类
            testTre temp = (testTre) obj; // 强制类型转换
            return temp.id == this.id;
        }
        return false;
    }
    @Override
    public int hashCode(){
        return Integer.valueOf(this.id).intValue();
    }
}
public class Treeset {
    public static void main(String[] args){
        TreeSet Ts = new TreeSet();
        Ts.add(new testTre("2020106",12));
        Ts.add(new testTre("2020108",19));
        Ts.add(new testTre("2020208",15));
        Ts.add(new testTre("2020104",22));
        Ts.add(new testTre("2020124",19));
        Ts.add(new testTre("2020124",19));

        System.out.println(Ts);
    }
}
// TreeSet:
// [[student 2020106 is 12 years old], [student 2020208 is 15 years old],
//  [student 2020108 is 19 years old], [student 2020104 is 22 years old]]

treeSet 和 HashSet 存放的元素都是唯一的, HashSet 是根据equals 和 hashCode 来判断元素是否重读 而 treeSet 是根据compareTo 来判断 大于0 放左边小于0 放右边 等于0 判断为相同忽略

img