Java中的Comparator和Iterator

版权声明:本文为博主原创文章,未经博主允许不得转载。 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强调的是一种规范,其中的方法定义了该规范的行为,实现该接口,需要实现迭代细节


猜你喜欢

转载自blog.csdn.net/hongjunliu1989/article/details/73457688