Comparable是一個對象本身就已經支持自比較所需要實現的接口(如String、Integer、Float自己就可以完成比較大小操作)。
Comparator是一個專用的比較器,當這個對象不支持自比較或者自比較函數不能滿足你的要求時,你可以寫一個比較器來完成兩個對象之間大小的比較。
Comparable是通用的接口,用戶可以實現它來完成自己特定的比較,而comparator可以看成一種算法的實現,在需要容器集合collection需要比較功能的時候,來指定這個比較器,這是策略設計模式。
換言之,Comparable比較固定,和一個具體類相綁定,而Comparator比較靈活,它可以被用於各個需要比較功能的類使用。
Comparator的作用有兩個:
1. 如果類的設計師沒有考慮到Compare的問題而沒有實現Comparable接口,可以通過 Comparator來實現比較算法進行排序 ;
2. 爲了使用不同的排序標準做準備,比如:升序、降序或其他什麼序。
下面通過兩個例子分別用Comparable和Comparator實現對User對象中年齡排序。
1.通過實現Comparable接口,根據User的年齡進行排序。
import java.util.Arrays;
/**
* @author Young
*
*/
public class User implements Comparable<User> {
private String id;
private int age;
public User(String id, int age) {
this.id = id;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
@Override
public String toString() {
return "User [id=" + id + ", age=" + age + "]";
}
@Override
public int compareTo(User o) {
return this.age - ((User) o).getAge();
}
/**
* 測試方法
*/
public static void main(String[] args) {
User[] users = new User[] {
new User("100", 25),
new User("101", 20),
new User("102", 21) };
Arrays.sort(users);
for (User user : users) {
System.out.println(user.getId() + " " + user.getAge());
}
}
}
2. 通過實現Comparator接口,根據User的年齡進行排序。/**
* @author Young
*
*/
public class User{
private String id;
private int age;
public User(String id, int age) {
this.id = id;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((id == null) ? 0 : id.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
User other = (User) obj;
if (id == null) {
if (other.id != null)
return false;
} else if (!id.equals(other.id))
return false;
return true;
}
@Override
public String toString() {
return "User [id=" + id + ", age=" + age + "]";
}
}
import java.util.Arrays;
import java.util.Comparator;
/**
* @author Young
*
*/
public class UserComparator implements Comparator<User> {
@Override
public int compare(User o1, User o2) {
return ((User) o1).getAge() - ((User) o2).getAge();
}
/**
* 測試方法
*/
public static void main(String[] args) {
User[] users = new User[] {
new User("100", 25),
new User("101", 20),
new User("102", 21) };
Arrays.sort(users,UserComparator);
for (User user:users) {
System.out.println(user.getId() + " " + user.getAge());
}
}
}