这个函数具体老师上课并没有讲解,但是考试的时候直接考了,感觉还是有点慌。所以整理一下
Collections.sort 介绍
首先注意Collections和Collection的区别。Collection是一个集合类顶级接口,直接继承他的有List和Set。具体如下
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Collections是Java.util中的一个工具类,里面提供了一系列的静态方法用来操作Collection对象
因此总结来说Collection是一个本体,而Collections是操作这个本体的工具。
然后具体说一下sort函数。sort是用来对List对象进行排序的工具方法。是Collections中的一个静态方法。有两种传参形式,一个是直接传入一个List对象,此时默认对List对象进行升序排序操作。这里我们主要关注第二种,传入一个List和Comparator对象。
Comparable和Comparator
Comparable
Comparable 是排序接口。
若一个类实现了Comparable接口,就意味着“该类支持排序”。 即然实现Comparable接口的类支持排序,假设现在存在“实现Comparable接口的类的对象的List列表(或数组)”,则该List列表(或数组)可以通过 Collections.sort(或 Arrays.sort)进行排序。
此外,“实现Comparable接口的类的对象”可以用作“有序映射(如TreeMap)”中的键或“有序集合(TreeSet)”中的元素,而不需要指定比较器。
Comparable里面只有一个函数compareTo
假设我们通过 x.compareTo(y) 来“比较x和y的大小”。若返回“负数”,意味着“x比y小”;返回“零”,意味着“x等于y”;返回“正数”,意味着“x大于y”。方便记忆为"x-y"。
package java.lang;
import java.util.*;
public interface Comparable<T> {
public int compareTo(T o);
}
Comparator
Comparator 是比较器接口。
我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“该类的比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。
也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。
package java.util;
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
总结
Comparable是指一个类直接实现Comparable接口,表示该类支持大小比较和排序。所以对应于sort的内部实现。Comparator是指一个外部类实现Comparator接口,表示原来的类只能通过委托该类进行大小比较,对应于Sort的外部实现。
Sort的传参方法
因此Sort的传参方法即对应了上面的两种比较的实现
可比较的类
public static <T extends Comparable<? super T>> void sort(List<T> list) {
list.sort(null);
}
对于可比较的类,即实现了Comparable接口的类,我们可以只把这个类当作参数传进去,此时会缺省地调用list中的compareTo方法,然后进行排序。通过这个函数的行为我们可以知道
不可比较的类
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
这里的不可比较指的是,这个类没有实现Comparable接口,此时我们就需要依赖于外部的排序接口Comparator。