目录
1.认识 TreeMap 和 TreeSet
TreeMap 继承自 AbstractMap,而 AbstractMap 继承自 Map ,所以 TreeMap 是利用搜索树实现的 Map ,它的底层结构是红黑树,用于存储键值对,并且能够对键进行排序。

同样地,TreeSet 继承自 AbstractSet,而 AbstractSet 继承自 Set ,所以 TreeSet 是利用搜索树实现的 Set ,TreeSet 的底层是 TreeSet,所以底层结构也是红黑树,但它只能存放关键字 Key ,能对键进行排序。

2.构造方法
2.1 TreeMap 的构造方法
主要的构造方法:

(1)TreeMap():这是一个没有参数的构造方法,所以这个方法它的排序是默认的

(2)TreeMap(Comparator<? super K> comparator) :这个构造方法可以自定义比较器,根据实际需求重写比较方法

(3)TreeMap(Map<? extends K,? extends V> m):把传递的Map构造一个新的映射关系

2.2 TreeSet 的构造方法
主要的构造方法:

TreeSet 的构造方法和 TreeMap 用法相似。
TreeSet 和 TreeMap 的常用方法其实在上一篇文章《Map和Set》已经给出,但是强烈建议去看源码文档。
3.元素对象必须可比较
使用 TreeMap 和 TreeSet 时,它们传入的对象必须可比较,这是其底层实现和设计目标决定的。它们底层的数据结构是红黑树,而红黑树是一种自平衡的二叉搜索树,当传入和查找对象时,都需要依赖比较来确定对象所在的位置;TreeMap 和 TreeSet 的核心价值在于提供有序集合,想要达到有序,那么它的对象就必须具备比较能力,可以看看源码内部的 put 方法;除此之外,它们的比较还要判断元素是否重复。

如果传入的是一个不能比较的对象,那么就会抛出一个异常 ClassCastException ,如下:

既然传入的对象要可比较,那么怎么对一个学生类进行排序呢?
4.重写比较方式
class Student {
public int score;//成绩
public String name;//分数
//构造方法
public Student(int score, String name) {
this.score = score;
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"score=" + score +
", name='" + name + '\'' +
'}';
}
}
public class Test {
public static void main(String[] args) {
Map<Student, Integer> map = new TreeMap<>(new Comparator<Student>() {
@Override
//重写比较方式,根据姓名按逆序排列
public int compare(Student o1,Student o2) {
return o2.name.compareTo(o1.name);
}
});
map.put(new Student(80, "张三"), 1);
map.put(new Student(90, "李四"), 1);
map.put(new Student(95, "王麻子"), 2);
for (Map.Entry<Student, Integer> studentIntegerEntry : map.entrySet()) {
System.out.println(studentIntegerEntry);
}
}
}
运行结果:

201

被折叠的 条评论
为什么被折叠?



