Comparable和Comparator区别是什么?差点吃屎
夫陶公清風(fēng)千古,余又何人,敢稱庶幾
📖介紹
💡 先抽支煙(建議抽5塊錢(qián)一包的,省點(diǎn)錢(qián)買(mǎi)皮膚)!我先查下這兩個(gè)單詞是什么意思(英語(yǔ)不好,六級(jí)考了3次,至今未過(guò))
💡 從上面兩張白白胖胖的圖片中我們可以發(fā)現(xiàn),這兩個(gè)單詞都有比較的意思,只是前者是形容詞,后者是名詞(我TM說(shuō)這些有用嗎!滾😠)。
接下來(lái),讓我們團(tuán)起場(chǎng)子,翹起二郎腿😀好好研究下這兩個(gè)性感的單詞有什么異同點(diǎn):
🍎相同點(diǎn):
- 都是用來(lái)比較對(duì)象的
🍉不同點(diǎn)
-
Comparable在java.lang 包下
-
Comparator在java.util 包下
-
Comparator通常用于對(duì)象之間排序,Java Api提供的Collections和Arrays中的sort方法可以接受一個(gè)Comparator對(duì)象,從而實(shí)現(xiàn)排序
-
Comparator可以在不修改類的情況下實(shí)現(xiàn)多種情況的比較,比如我們需要比較一個(gè)學(xué)生,我們可以通過(guò)年齡比較,也可以通過(guò)體重和身高比較(其實(shí)還闊以通過(guò)性感值比較😄),而Comparable接口就??不闊以,只能通過(guò)自身對(duì)象與其他對(duì)象比較,還是看看源碼吧:
??咦?啥玩意兒!我發(fā)現(xiàn)了一個(gè)秘密,compare和compareTo長(zhǎng)得不一樣,前面那個(gè)好短,后面那個(gè)好長(zhǎng),compare里面可以放兩個(gè)蛋,而compareTo只能放一個(gè)蛋(說(shuō)這些有用嗎,操!),通過(guò)我九九八十一級(jí)英語(yǔ)水平,我得知,compare是比較的意思;compareTo是與...比較的意思(我與你比較總是不同,性感值不一樣)。
💻Comparable
要使用Comparable這玩意兒,我們需要定義一個(gè)類去實(shí)現(xiàn)(implements)它,并且重寫(xiě)(@Override)compareTo方法,該類一旦實(shí)現(xiàn)了Comparable接口就可以使用自身對(duì)象和其他對(duì)象進(jìn)行比較了,Comparable相當(dāng)于自己干自己,聽(tīng)起來(lái)好像有點(diǎn)兒意思(我差點(diǎn)就睡著了),現(xiàn)在我們來(lái)做個(gè)案例:
??
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;}}??測(cè)試:
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("對(duì)象1大于對(duì)象2");} else if (test < 0) {System.out.println("對(duì)象1小于對(duì)象2");} else {System.out.println("對(duì)象相等");}} }🎨
對(duì)象1小于對(duì)象2??上面代碼明顯暴露出了俺上面所說(shuō)的Comparable不可以進(jìn)行多種類型的比較; 有時(shí)我們需要通過(guò)年齡,有時(shí)需要通過(guò)身高(不過(guò)你也可以通過(guò)性感值)去比較一個(gè)人,如果要換一種方式比較就要修改Student類,這顯然不可取的。
💻Comparator
我們可以使用Comparator去解決Comparable的缺點(diǎn),可以按照不同的情況進(jìn)行比較。 讓我們看一下在web開(kāi)發(fā)中的實(shí)際應(yīng)用吧(我猜的,希望有高人指點(diǎn)):
從這張秀氣的圖片中,我們可以看到表單中列表有很多字段(比如用戶ID、登錄名稱、部門(mén)…),這些字段都屬于User實(shí)體,我們可以通過(guò)登錄名稱排序,也可以通過(guò)創(chuàng)建時(shí)間排序。 好像越來(lái)越有意思了!
??實(shí)體類:
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和重寫(xiě)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;} }??測(cè)試:
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'}通過(guò)使用年齡比較器(AgeComparator ),可以看到對(duì)象通過(guò)年齡從小到大排序,你也可以寫(xiě)一個(gè)ID比較器(IdComparator )(按照ID大小比較)等等,總之你想怎么干就怎么干。
通過(guò)上面學(xué)習(xí),我們大概也了解了這兩個(gè)接口的區(qū)別和使用,只是簡(jiǎn)單入門(mén),要深入還得深入去學(xué)習(xí)!!!
建議去看Java API文檔 :Comparable 、Comparator
總結(jié)
以上是生活随笔為你收集整理的Comparable和Comparator区别是什么?差点吃屎的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python使用PyMysql连接MyS
- 下一篇: 程序员刷题网站