Comparator 和 Comparable的區別

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);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章