Collection 和 Collections以及Comparable 和 Comparator
一. Collection 和 Collections
java.util.Collection 是集合类的上级接口,它提供了对集合对象进行基本操作的通用接口方法,如:add、remove等。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
java.util.Collections 是一个帮助类。此类不能实例化,就像一个工具类,服务于Java的Collection框架。它包含有各种有关集合操作的静态方法,例如:实现对集合的排序、混排(shuffle)、反转(reverse)、返回集合中最小元素(min)、返回集合中最大元素(max)等方法。
二.Comparable 和 Comparator
- comparable接口实际上是出自java.lang包 它有一个
compareTo(Object obj)
方法用来排序 - comparator接口实际上是出自 java.util 包它有一个
compare(Object obj1, Object obj2)
方法用来排序
一般我们需要对一个集合使用自定义排序时,我们就要重写compareTo()
方法或compare()
方法,当我们需要对某一个集合实现两种排序方式,比如一个song对象中的歌名和歌手名分别采用一种排序方法的话,我们可以重写compareTo()
方法和使用自制的Comparator方法或者以两个Comparator来实现歌名排序和歌星名排序,使用第二种继承Comparator接口的方法意味着我们要实现两个参数版的比较方法。
Comparable 是排序接口,意味着“该类支持排序”。Comparable接口只包括一个方法,它的定义如下:
package java.lang;
import java.util.*;
public interface Comparable<T> {
public int compareTo(T o);
}
Comparator 是比较器接口,若某个类本身不支持排序(即没有实现Comparable接口),那么我们可以通过“实现Comparator接口来新建一个比较器”,然后通过该类比较器对类进行排序。
Comparator接口包括两个方法:
package java.util;
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
总结:
“Comparable”,它是一个排序接口,只包含一个函数 compareTo()。一个类实现了Comparable接口,就意味着“该类本身支持排序”,它可以直接通过 Arrays.sort() 或 Collections.sort() 进行排序。
"Comparator"它是一个比较器接口,包括两个函数:compare() 和 equals()。一个类实现了Comparator 接口,那么它就是一个“比较器”。其它的类,可以根据该比较器去排序。综上所述:Comparable是内部比较器,而Comparator是外部比较器。
一个类本身实现了Comparable比较器,就意味着它本身支持排序;若它本身没实现Comparable,也可以通过外部比较器Comparator进行排序。
那么该如何重写Comparator接口中的compare(Object o1, Object o2)方法呢?
Collections.sort(list, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
String s1 = String.valueOf(o1) + String.valueOf(o2);
String s2 = String.valueOf(o2) + String.valueOf(o1);
if (s1.compareTo(s2) < 0) {
// 如果前者小于后者,则返回-1
return -1;
}
if (s1.compareTo(s2) > 0){
// 如果前者大于后者,则返回1
return 1;
}
// 如果两者相等,则返回0
return 0;
}
});
那么该如何重写Comparable接口中的compareTo(Object o2)方法呢?
package java.lang;
import java.util.*;
public interface Comparable<T> {
public int compareTo(T o);
}
// 说明:一般来讲,o1.compareTo(Object o2) 如果o1 < o2的话,那么返回-1;如果o1>o2的话,返回1;否则,相等的话返回0。