版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hongjunliu1989/article/details/73457688
Java中的Comparator和Iterator
一、比较器Comparator
排序算法中,需要根据排序元素的值进行比较大小,从而确定顺序,针对引用类型Java定义了两个接口如下:
1、public interface Comparable<T>
public interface Comparable<T> {
/**
* 返回值为int类型,对应关系如下:
* 正数 this > T o ;负数 this < T o ;0 this = T o
*/
public int compareTo(T o);
}
Comparable为可比较的,形容词,接口定义的是一种行为,实现该接口的类为可比较的(is-a的关系,is-a强调的是行为),表示当前类是一种可以比较的Object,例如JDK下的Integer类实现了Comparable,所以Integer是可以比较的,从而可以调用JDK下工具类Arrays、Collections中的相关方法进行排序,方法如下:
Arrays:
public static void sort(Object[] a);
Collections:
public static <T extends Comparable<? super T>> void sort(List<T> list);
追踪Arrays下sort(Object[] a)方法会发现程序会将入参中的Object[]每个元素向上转型为Comparable;而Collections下的sort(List<T> list)方法为泛型泛型方法,对入参做了限制,必须实现Comparable
2、public interface Comparator<T>
public interface Comparator<T> {
/**
* 返回值为int类型,对应关系如下:
* 正数 T o1 > T o2 ;负数 T o1 < T o2 ;0 T o1 = T o2
*/
int compare(T o1, T o2);
boolean equals(Object obj);
}
Comparator为比较器,名词,定义的是一种策略,实现该接口的类可以说是一种比较策略,排序方法可以通过不同的比较策略来进行排序。此方法比较灵活,例如当存在未实现Comparable接口的类需要排序,而又不想修改当前类或当前类为第三方类不能修改时,可以通过定义一个当前类的Comparator实现排序;另外,不同需求可能需要不同的排序策略,此时可以针对不同的需求定义不同的Comparator策略,例如员工类,可以通过入职时间排序、通过工龄排序或者通过薪资排序等。JDK下工具类Arrays、Collections中的相关方法如下:
Arrays:
public static <T> void sort(T[] a, Comparator<? super T> c);
Collections:
public static <T> void sort(List<T> list, Comparator<? super T> c);
以上方法为泛型方法,对入参做了限制。
二、迭代器Iterator
理解了比较器,在来看迭代器就简单了,关于迭代,主要对比下Iterable和Iterator,接口定义如下:
public interface Iterable<T> {
Iterator<T> iterator();
}
public interface Iterator<E> {
// 是否存在下一个元素
boolean hasNext();
// 获取下一个元素
E next();
// 删除当前元素
void remove();
}
Iterable为可迭代的,Iterator为迭代器。Iterable强调的是一种行为,实现该接口的类具备可迭代的能力,但无需知道如何迭代,不关注细节。而Iterator强调的是一种规范,其中的方法定义了该规范的行为,实现该接口,需要实现迭代细节