TreeSet跟TreeMap条件限制

面试题如下

56、TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
答:TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小。TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序。

从上可得出放入TreeSet跟TreeMap的对象一定要实现Comparable?

有如下2个问题

  1. 本人写了一段测试代码,发现如果对象不实现该接口一样可以放进去 2.如果不实现该接口放进去的话,对象有序吗。

代码如下

 import java.util.*;

public class Leetcode {
    public static void main(String[] agrs){
        Map<Integer,Student> map = new TreeMap<>();
        Student student = new Student();
        map.put(1,student);
        Set<Student> set = new TreeSet<>();
        set.add(student);
    }

}



public class Student {
    private String name;
    private int age;
    private int score;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }
}

如果想把自定义类的对象存入TreeSet用sort进行排序, 那么才需要实现Comparable接口,你的“回答”要么断章取义,要么是错的。

之前说了,两个序不是一回事。

hello world放入字符集合,拿出来还是hello world叫有序。拿出来是别的,比如hwoeollrdl就是无序
实现Comparable是为了排序,比如 edhllloorw,这个叫排序。

有序分

2种
1、进出顺序 相同 这叫有序,
2、 进去之后 在里面进行自然排序 以数字 字母 或者自定义排序器 进行 ,compator更方便,不需要类实现接口。 comparable就是后者。实体类不实现该接口无法排序。String 可以排序是自带实现了comparable 所以用户需要排序也要实现。当然最好使用compator更方便不需要破坏原类

如果仅仅是为了有序 不是必须实现comparable【该比较方法compareto好像是一个参数】, 可以选择实现compator比较器【该compar方法好像是2个参数】
如果是为了有序且不想单独设计比较器compator 那么只有该类实现comparable接口。
综上所述 treemap有重载构造。可以传入一个实现了comparable接口的自然排序规则,也可以传入一个实现了compator接口的任何自定义的排序规则。后者更常用。