Comparable和Comparator区别是什么?差点吃屎
夫陶公清風千古,余又何人,敢稱庶幾
📖介紹
💡 先抽支煙(建議抽5塊錢一包的,省點錢買皮膚)!我先查下這兩個單詞是什么意思(英語不好,六級考了3次,至今未過)
💡 從上面兩張白白胖胖的圖片中我們可以發現,這兩個單詞都有比較的意思,只是前者是形容詞,后者是名詞(我TM說這些有用嗎!滾😠)。
接下來,讓我們團起場子,翹起二郎腿😀好好研究下這兩個性感的單詞有什么異同點:
🍎相同點:
- 都是用來比較對象的
🍉不同點
-
Comparable在java.lang 包下
-
Comparator在java.util 包下
-
Comparator通常用于對象之間排序,Java Api提供的Collections和Arrays中的sort方法可以接受一個Comparator對象,從而實現排序
-
Comparator可以在不修改類的情況下實現多種情況的比較,比如我們需要比較一個學生,我們可以通過年齡比較,也可以通過體重和身高比較(其實還闊以通過性感值比較😄),而Comparable接口就??不闊以,只能通過自身對象與其他對象比較,還是看看源碼吧:
??咦?啥玩意兒!我發現了一個秘密,compare和compareTo長得不一樣,前面那個好短,后面那個好長,compare里面可以放兩個蛋,而compareTo只能放一個蛋(說這些有用嗎,操!),通過我九九八十一級英語水平,我得知,compare是比較的意思;compareTo是與...比較的意思(我與你比較總是不同,性感值不一樣)。
💻Comparable
要使用Comparable這玩意兒,我們需要定義一個類去實現(implements)它,并且重寫(@Override)compareTo方法,該類一旦實現了Comparable接口就可以使用自身對象和其他對象進行比較了,Comparable相當于自己干自己,聽起來好像有點兒意思(我差點就睡著了),現在我們來做個案例:
??
public class Student implements Comparable<Student> {private int id;private String name;private int age;public Student(int age) {this.age = age;}// 省略get set方法@Overridepublic int compareTo(Student o) {if (this.getAge() > o.getAge()) {return 1;}if (this.getAge() < o.getAge()) {return -1;}return 0;}}??測試:
public class ComparableTest {public static void main(String[] args) {Student stu1 = new Student(22);Student stu2 = new Student(30);int test = stu1.compareTo(stu2);if (test > 0) {System.out.println("對象1大于對象2");} else if (test < 0) {System.out.println("對象1小于對象2");} else {System.out.println("對象相等");}} }🎨
對象1小于對象2??上面代碼明顯暴露出了俺上面所說的Comparable不可以進行多種類型的比較; 有時我們需要通過年齡,有時需要通過身高(不過你也可以通過性感值)去比較一個人,如果要換一種方式比較就要修改Student類,這顯然不可取的。
💻Comparator
我們可以使用Comparator去解決Comparable的缺點,可以按照不同的情況進行比較。 讓我們看一下在web開發中的實際應用吧(我猜的,希望有高人指點):
從這張秀氣的圖片中,我們可以看到表單中列表有很多字段(比如用戶ID、登錄名稱、部門…),這些字段都屬于User實體,我們可以通過登錄名稱排序,也可以通過創建時間排序。 好像越來越有意思了!
??實體類:
public class Student {private long id;private int age;private String name;public Student(long id, String name, int age) {this.id = id;this.name = name;this.age = age;}// 省略get、set和重寫toString方法}??年齡比較器:
public class AgeComparator implements Comparator<Student> {@Overridepublic int compare(Student o1, Student o2) {if (o1.getAge() > o2.getAge()) {return 1;} else if (o1.getAge() < o2.getAge()) {return -1;}return 0;} }??測試:
public class ComparatorTest {public static void main(String[] args) {Student stu1 = new Student(20180101, "zwj", 20);Student stu2 = new Student(20180106, "dgqb", 16);Student stu3 = new Student(20180102, "zxxz", 75);Student stu4 = new Student(20180111, "hqg", 36);Student stu5 = new Student(20180121, "xyw", 18);ArrayList<Student> list = new ArrayList<>();list.add(stu1);list.add(stu2);list.add(stu3);list.add(stu4);list.add(stu5);Collections.sort(list, new AgeComparator()); //排序list.forEach(stu -> System.out.println(stu)); //打印} }🎨
{ id='20180106', age='16', name='dgqb'} { id='20180121', age='18', name='xyw'} { id='20180101', age='20', name='zwj'} { id='20180111', age='36', name='hqg'} { id='20180102', age='75', name='zxxz'}通過使用年齡比較器(AgeComparator ),可以看到對象通過年齡從小到大排序,你也可以寫一個ID比較器(IdComparator )(按照ID大小比較)等等,總之你想怎么干就怎么干。
通過上面學習,我們大概也了解了這兩個接口的區別和使用,只是簡單入門,要深入還得深入去學習!!!
建議去看Java API文檔 :Comparable 、Comparator
總結
以上是生活随笔為你收集整理的Comparable和Comparator区别是什么?差点吃屎的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python使用PyMysql连接MyS
- 下一篇: Java-稀疏数组