前言
java中如果2个对象需要进行比较(对于某个成员对象的比较),可以有2种方式,实现接口Comparable和Comparator。它们之间还有区别。
Comparable接口
源码如下:
public interface Comparable<T> {
public int compareTo(T o);
}
这个接口主要是实现自身对象与其他对象的比较。只需要实现这个接口,就可以直接采取CompareTo进行对象的比较,内部实现具体字段的比较即可。
String就实现了此接口,源码如下:
public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;
int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}
Comparator接口
源码如下:
public interface Comparator<T> {
int compare(T o1, T o2);
boolean equals(Object obj);
}
这个比较可以实现2个对象之间的比较,想对于Comparable来说,就很独立了。所比较的类无需实现接口,由其他类实现接口,调用方法,将比较对象传递进去进行比较即可。同时还能灵活控制比较类型。如下:
public class Compare implements Comparator<User> {
private String type;
public Compare(String type){
this.type = type;
}
public int compare(User user1, User user2) {
if (type.equals("id")){
//TODO
}else if (type.equals("name")){
//TODO
}
return 0;
}
}
根据传递的不同参数,决定不同对象之间比较哪些属性即可。
场景
1.自定义详细的排序,采取Comparator即可。可调用Collections.sort()、Arrays.sort()方法。
2.TreeMap构造参数可传递Comparator。
其余随意。
注:
当我们需要对中文等排序时,可结合刚刚的排序方法。如下所示,可比较出中文的先后顺序。
String title1 = "北京;
String title2 = "上海";
int title = Collator.getInstance(Locale.CHINA).compare(title1, title2);
详细方法可参考其他文章:
http://www.hollischuang.com/archives/1292