1)詳細說明對象的比較方式有哪些?
①對象引用的比較("= ="運算符)
"= ="是將對象的引用進行比較,實質是比較兩個引用變量是否引用同一個對象。注意的點:字符串常量的比較時,JVM為同一個字符串常量只創建一個對象。
②對象內容的比較(equals()方法)
equals()方法是比較兩個對象的實際內容是否相同。注意的點:從源碼可知,equals()方法首先會做"= ="比較,只有當兩個變量引用的是不同對象時才進行內容的比較,節省一定的資源。
③自定義對象的比較(java.util.Comparator接口和java.lang.Comparable接口)
A.java.util.Comparator接口:
保持自定義類不變化,在此之外編寫一個比較算法(比較器類),它實現了Comparator接口。
Comparator接口定義了一個compare(T o1,T o2)方法:比較用來排序的兩個參數。
/*@return o1小於、等於或者大於o2,分別返回負整數、零或者正整數。*/
此時,compare()方法的具體實現有了,再將Comparator傳遞給Collections.sort或Arrays.sort方法來實現排序。
B.java.lang.Comparable接口:
需要對自定義類進行改變,即實現Comparable接口,讓它具有比較的功能。
Comparable接口定義了一個compareTo(T o)方法:比較此對象與指定對象的順序。
/*@return 該對象小於、等於或者大於o,分別返回負整數、零或者正整數。*/
Comparable接口強行對實現它的每個類的對象進行整體排序,實現此接口的對象列表(和數組)可以通過Collection.sort或Arrays.sort進行自動排序。
例子可以觀察,TreeSet構造函數中的TreeSet(Comparator<? super E> comparator)和TreeSet()。
2) 用一個生活中的對象來生動地說明Comparator和Comparable的區別。
在英語中,tor是常見的人稱后綴,visi-tor(訪問者),crea-tor(創造者)...個人認為Comparator就像是車險公司(第三方),重大的復雜的交通事故中保險公司要出人、出力去評估主要責任、次要責任等細則來划分保險金額。
而able在英語中,表示能力、能夠。一個類實現了Comparable接口,代表着它被賦予了一種比較的能力。小型剮蹭事故中,兩位車主私下協商、賠償一下就完事兒了。