java编程的小问题


public class Staff implements Comparable<Staff> {
    private String name;
    private Integer age;
    private String gender;

    public Staff() {
    }

    public Staff(String name, Integer age, String gender) {
        this.name = name;
        this.age = age;
        this.gender = gender;
    }

    @Override
    public int compareTo(Staff o) {
        return Integer.compare(this.age, o.age);
    }

public class TestStaff {
    public static void main(String[] args) {
        TreeSet set = new TreeSet<>();
        Staff staff1 = new Staff("lee",25,"men");
        set.add(staff1);
        Staff staff2 = new Staff("chou",27,"men");
        set.add(staff2);
        Staff staff3 = new Staff("zhao",30,"women");
        set.add(staff3);
        System.out.println(set);
    }
}

我的基础不是很好,希望各位能指点一二
为什么会自动调用Staff类里的compareTo方法呢?而且为什么没有用staff1.compareTo()就直接通过set.add()调用了该方法

这就要看 TreeSet 的 add 方法的源码了,

img

TreeSet内部实现是 TreeMap,再继续看 put方法; 每次添加一个元素,就会 调用 添加数据的 compareTo方法,往 二叉树的左节点或者右节点上添加数据。

img

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/798987
  • 以下回答来自chatgpt:

    这是因为Set集合中的元素是有序的,而且是通过compareTo方法进行排序的。当向Set集合中添加元素时,会自动调用元素类的compareTo方法来确定插入位置。如果两个元素的compareTo比较结果相同,则被认为是相同的元素,不会重复插入。

    因此,如果想要在Set集合中保持元素的顺序,就必须在元素类中实现Comparable接口并重写compareTo方法。

    以下是Staff类的例子:

    public class Staff implements Comparable<Staff> {
        private String name;
        private int age;
    
        public Staff(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        // 重写compareTo方法,按照年龄升序排序
        @Override
        public int compareTo(Staff staff) {
            return this.age - staff.age;
        }
    
        // hashCode和equals方法也要重写
        @Override
        public int hashCode() {
            return Objects.hash(name, age);
        }
    
        @Override
        public boolean equals(Object obj) {
            if (this == obj) {
                return true;
            }
            if (obj == null || getClass() != obj.getClass()) {
                return false;
            }
            Staff staff = (Staff) obj;
            return age == staff.age && Objects.equals(name, staff.name);
        }
    }
    

    这里重写了compareTo方法,按照年龄升序排序。同时也重写了equals和hashCode方法,以保证Set集合能够正确地判断两个对象是否相同。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^