1.位置
Comparable 位於 java.lang,我們都知道 java.lang包可以說是 java體系中基礎包,有 ClassLoader、Class、Object、基本類型等
Comparator 位於 java.util,也就是 java 自帶的類庫,包括一些常用的集合類、strem、function
所以從這個角度來說,Comparator 也屬於類庫的一種就是爲了方便開發,而 Comparable 就很重要了,整個 java 體系中的基礎類而不是僅僅爲了開發方便。
2.描述
Comparable: This interface imposes a total ordering on the objects of each class that implements it.
可以通過 Collections.sort()、Arrays.sort() 方法進行排序,若某對象實現了 Comparable 則該對象的 SortedMap 、SortSet 會自動對對象進行排序,並不需要 Comparator 對其進行手動排序。
Comparator: A comparison function, which imposes a total ordering on some collection of objects.
Comparator可以對非已經排好序的進行排序,而且還可以對已經有順序的SortedMap、SortSet 進行排序。
3.使用
public class ComparatorTextList {
public static void main(String[] args) {
List<User> userlist = new ArrayList<User>();
User user1 = new User("Y - 易小星 ", 31);
User user2 = new User("W - 王大錘", 33);
userlist.add(user1);
userlist.add(user2);
//更偏向於對一系列的對象,需要手動對對象進行排序
Comparator<User> cmp = new ComparatorUser();
Collections.sort(userlist, cmp);
for (User user : userlist) {
System.out.println(user.getName());
}
System.out.println("hsahSet=====");
HashSet<User> users = new HashSet<>();
users.add(user1);
users.add(user2);
for (User user : users) {
System.out.println(user.getName());
}
System.out.println("treeSet=====");
//實現了 Comparable 接口,對於有序集合是自動排序的。但讓也可以通過 Comparator 對其進行排序
TreeSet<User> treeSet = new TreeSet<>();
treeSet.addAll(users);
for (User user : treeSet) {
System.out.println(user.getName());
}
//實現了 Comparable 接口,它可以與相應的類對象進行比較
System.out.println(user2.compareTo(user1));
}
}
//也需要遵循 the general contract,建議實現 Serializable 接口
class ComparatorUser implements Comparator<User> {
@Override
public int compare(User u1, User u2) {
// 先按年齡排序
int flag = u1.getAge().compareTo(u2.getAge());
// 年齡相等比較姓名
if (flag == 0) {
return u1.getName().compareTo(u2.getName());
} else {
return flag;
}
}
}
class User implements Comparable<User> {
private String name;
private Integer age;
public User() {
super();
}
public User(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public int compareTo(@NotNull User user) {
// 先按年齡排序
int flag = this.age.compareTo(user.getAge());
// 年齡相等比較姓名
if (flag == 0) {
return this.getName().compareTo(user.getName());
} else {
return flag;
}
}
//最好是重寫一下 equals 方法,防止兩個類對象相同而 equals 不同,不滿足 Object 的約束
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
User user = (User) o;
return Objects.equals(name, user.name) &&
Objects.equals(age, user.age);
}
//同理的,重寫 equals 方法,一般都需要重寫 hashCode 方法,這樣才能保證,equals 相等的兩個對象的 hashCode 也相同,
// 滿足 Object 約束
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}