Collections、Comparable、Comparator
Collections
操作集合的工具类,包含很多操作集合的静态方法
直接Collections.方法名就可以使用
返回值 | 方法名 | 说明 |
---|---|---|
boolean | addAll(Collection<?super T> c,T…elements) | 往集合中添加一些元素 |
void | shuffle(List<?> list) | 使用默认的随机源重新排列指定的集合 |
void | sort(List list, Comparator<? super T> c) | 使用指定的比较器对集合进行排序 |
- sort()方法也可以不指定比较器,使用默认的规则,那么就要我们存储在集合中的元素实现Comparable接口,就是写一个排序规则,一般系统定义的类都会实现这个方法,
Comparable接口
-
当成一个内比较器,实现这个接口的类可以给自己实例化的对象做比较,从而将这个类创建的对象排出个序来。
-
Integer类中就实现了这个接口:
public final class Integer extends Number implements Comparable<Integer> {
-
-
但是我们自定义的类要使用sort方法时,就需要我们自己去实现Comparable接口
- (类名后加implements Comparable,根据提示重写compareTo方法即可)
@Override public int compareTo(Object o) { Student student = (Student)o; if (this.getId()>student.getId()){ return 1; }else if (this.getId()<student.getId()){ return -1; }else { return 0; } }
Comparator接口
可以将它当成一个外比较器。实现这个接口专门写出一个比较器类来,用来给特定的类个性化排序。
在我们使用sort()方法时,除了使用类去实现Comparable接口外,其实还可以自定义一个比较器,当我们想要使用自己指定的规则去排序时,就可以直接使用写好的比较器。
Comparator接口,排序是它能实现的功能之一
public class MyComparator1 implements Comparator<Student> {
@Override
public int compare(Student o1, Student o2) {
if (o1.getId()> o2.getId()){
return 1;
}else if (o1.getId()<o2.getId()){
return -1;
}else {
return 0;
}
}
}
Comparable 和Comparator接口的区别
- Comparable:
- 强行对实现它的每一个类的对象进行整体排序,这种排序被称为类的自然排序,类的compareTo方法被称为自然比较方法,只能在类中实现compareTo方法一次,使用十分死板。但是实现此接口的对象可以直接通过Collection.sort()方法来进行排序.
- Comparator:
- 强行对某个对象进行整体排序,可以将Comparator传递给sort方法,从而允许排序的规则自定义控制。
- Comparator的两个优点:
- 个性化比较:Comparator是单独定义的一个类,使用修改起来更加自由。想使用不同的排序规则就可以写不同的Comparator实现类。和需要排序的类放在一起就可以使用。
- 解耦:在类中实现Comparable接口的耦合性更大一些,我们想要修改排序规则时,Comparable就要修改实现类内部的compareTo方法,而Comparator在外部比较,直接修改(或者更换)比较器就可以。