Collections.sort 详解

这个函数具体老师上课并没有讲解,但是考试的时候直接考了,感觉还是有点慌。所以整理一下

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。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值