Java中Comparable和Comparator兩種比較器的區(qū)別詳解
Comparable接口
- 內(nèi)比較器 ,位于包java.util
- 自然排序(natural ordering)。compareTo方法也被稱為自然比較方法。
- Comparable接口將比較代碼嵌入自身類中。像Integer、String等這些基本類型的JAVA封裝類都已經(jīng)實(shí)現(xiàn)了Comparable接口,這些類對(duì)象本身就支持和自己比較,直接調(diào)用Collections.sort()就可以對(duì)集合中元素的排序,無(wú)需自己去實(shí)現(xiàn)Comparable接口。
Comparator接口
- 外比較器,位于包java.lang
- Comparator也叫臨時(shí)規(guī)則排序,也稱作專門規(guī)則排序
- 在一個(gè)獨(dú)立的類中專門實(shí)現(xiàn)比較。
- 場(chǎng)景:
- 一個(gè)對(duì)象不支持自己和自己比較(沒(méi)有實(shí)現(xiàn)Comparable接口),但是又想對(duì)兩個(gè)對(duì)象進(jìn)行比較
- 一個(gè)對(duì)象實(shí)現(xiàn)了Comparable接口,但是不能滿足要求時(shí)(比如升序 降序)
區(qū)別
實(shí)現(xiàn)Comparable接口的方式比實(shí)現(xiàn)Comparator接口的耦合性要強(qiáng)一些。因?yàn)槿绻薷谋容^算法,則需要修改Comparable接口的實(shí)現(xiàn)類,而實(shí)現(xiàn)Comparator的類是在外部進(jìn)行比較的,不需要對(duì)實(shí)現(xiàn)類有任何修改。
代碼
package collection; import java.util.Collections; import java.util.Comparator; import java.util.Iterator; import java.util.TreeSet; /* * TreeSet * set接口的實(shí)現(xiàn); * 基于哈希表和紅黑樹(shù) ,而哈希表用來(lái)保證元素的唯一性、 紅黑樹(shù)保證元素的有序。有序可以是: * 1)自然順序 * 2)比較器接口所定義的順序 */ class Student2{ private String name; private int age; public Student2(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Student2{" + "name='" + name + '\'' + ", age=" + age + '}'; } } public class Main { public static void main(String[] args) { // System.out.println("TreeSet:自然順序 ========="); // //String實(shí)現(xiàn)Comparable接口 使得String類型的對(duì)象是可比較 (排序方法,CompareTo) // TreeSet<String> treeset = new TreeSet<>(); // //添加元素 // treeset.add("圖形"); // treeset.add("電話"); // treeset.add("中國(guó)"); // // //遍歷元素,這里默認(rèn)按照首字母由大到小順序 // Iterator<String> itr1 = treeset.iterator(); // while(itr1.hasNext()){ // System.out.println(itr1.next()); // } // // System.out.println("=========="); // for(String s: treeset){ // System.out.println(s); // } // //刪除元素 // treeset.remove("電話"); // System.out.println(treeset); // System.out.println("TreeSet:比較器順序 ========="); //new的時(shí)候傳了一個(gè)比較器對(duì)象 //傳單獨(dú)的比較器對(duì)象 ,實(shí)現(xiàn)Comparator接口,排序方法compare TreeSet<Student2> treeset1 = new TreeSet<Student2>( new Comparator(){ @Override public int compare(Object o1, Object o2) { //按照姓名長(zhǎng)度 由短到長(zhǎng)排序 //如果姓名長(zhǎng)度相同,則按照年齡從小到大排序 int nameDiff = ((Student2)o1).getName().length() - ((Student2)o2).getName().length();//獲得差值.若為負(fù)數(shù),表示第一個(gè)參數(shù) 權(quán)重小,排序后會(huì)放在前面 https://blog.csdn.net/u013066244/article/details/78997869 if(nameDiff == 0 ){ return ((Student2)o1).getAge()- ((Student2)o2).getAge(); }else{ return nameDiff; } } } ); //添加元素 treeset1.add(new Student2("lisi", 22));//add(其實(shí)把值存到key里面,value是無(wú)效值---在源碼254行) treeset1.add(new Student2("zhangsan", 28)); treeset1.add(new Student2("zhaoliu", 23)); treeset1.add(new Student2("wangwu", 20)); treeset1.add(new Student2("zhangsan", 18)); //遍歷元素 Iterator<Student2> itr2 = treeset1.iterator(); while(itr2.hasNext()){ System.out.println(itr2.next()); } //System.out.println("=========="); //for(Student2 s: treeset1){ // System.out.println(s); //} } }
到此這篇關(guān)于Java中Comparable和Comparator兩種比較器的區(qū)別詳解的文章就介紹到這了,更多相關(guān)Comparable和Comparator比較器的區(qū)別內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot配置Profile實(shí)現(xiàn)多環(huán)境支持
這篇文章主要介紹了SpringBoot配置Profile實(shí)現(xiàn)多環(huán)境支持操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08IDEA?mybatis?Mapper.xml報(bào)紅的最新解決辦法
這篇文章主要介紹了IDEA?mybatis?Mapper.xml報(bào)紅的解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04javaSystem.out.println()輸出byte[]、char[]異常的問(wèn)題詳析
這篇文章主要給大家介紹了關(guān)于javaSystem.out.println()輸出byte[]、char[]異常問(wèn)題的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看啊2019-01-01springboot項(xiàng)目整合注冊(cè)功能模塊開(kāi)發(fā)實(shí)戰(zhàn)
這篇文章主要介紹了springboot項(xiàng)目整合注冊(cè)功能模塊開(kāi)發(fā)實(shí)戰(zhàn),在用戶的注冊(cè)是首先需要查詢當(dāng)前的用戶名是否存在,如果存在則不能進(jìn)行注冊(cè),相當(dāng)于一個(gè)查詢語(yǔ)句,本文通過(guò)實(shí)例代碼詳細(xì)講解,需要的朋友可以參考下2022-11-11java讀取html文件,并獲取body中所有的標(biāo)簽及內(nèi)容的案例
這篇文章主要介紹了java讀取html文件,并獲取body中所有的標(biāo)簽及內(nèi)容的案例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-08-08