Java中Comparable和Comparator兩種比較器的區(qū)別詳解
更新時間:2023年09月19日 09:48:15 作者:強欽欽
這篇文章主要介紹了Java中Comparable和Comparator兩種比較器的區(qū)別詳解,Comparable接口將比較代碼嵌入自身類中,像Integer、String等這些基本類型的JAVA封裝類都已經(jīng)實現(xiàn)了Comparable接口,這些類對象本身就支持和自己比較,需要的朋友可以參考下
Comparable接口
- 內比較器 ,位于包java.util
- 自然排序(natural ordering)。compareTo方法也被稱為自然比較方法。
- Comparable接口將比較代碼嵌入自身類中。像Integer、String等這些基本類型的JAVA封裝類都已經(jīng)實現(xiàn)了Comparable接口,這些類對象本身就支持和自己比較,直接調用Collections.sort()就可以對集合中元素的排序,無需自己去實現(xiàn)Comparable接口。
Comparator接口
- 外比較器,位于包java.lang
- Comparator也叫臨時規(guī)則排序,也稱作專門規(guī)則排序
- 在一個獨立的類中專門實現(xiàn)比較。
- 場景:
- 一個對象不支持自己和自己比較(沒有實現(xiàn)Comparable接口),但是又想對兩個對象進行比較
- 一個對象實現(xiàn)了Comparable接口,但是不能滿足要求時(比如升序 降序)
區(qū)別

實現(xiàn)Comparable接口的方式比實現(xiàn)Comparator接口的耦合性要強一些。因為如果要修改比較算法,則需要修改Comparable接口的實現(xiàn)類,而實現(xiàn)Comparator的類是在外部進行比較的,不需要對實現(xiàn)類有任何修改。
代碼
package collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
/*
* TreeSet
* set接口的實現(xiàn);
* 基于哈希表和紅黑樹 ,而哈希表用來保證元素的唯一性、 紅黑樹保證元素的有序。有序可以是:
* 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實現(xiàn)Comparable接口 使得String類型的對象是可比較 (排序方法,CompareTo)
// TreeSet<String> treeset = new TreeSet<>();
// //添加元素
// treeset.add("圖形");
// treeset.add("電話");
// treeset.add("中國");
//
// //遍歷元素,這里默認按照首字母由大到小順序
// 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的時候傳了一個比較器對象
//傳單獨的比較器對象 ,實現(xiàn)Comparator接口,排序方法compare
TreeSet<Student2> treeset1 = new TreeSet<Student2>( new Comparator(){
@Override
public int compare(Object o1, Object o2) {
//按照姓名長度 由短到長排序
//如果姓名長度相同,則按照年齡從小到大排序
int nameDiff = ((Student2)o1).getName().length() - ((Student2)o2).getName().length();//獲得差值.若為負數(shù),表示第一個參數(shù) 權重小,排序后會放在前面 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(其實把值存到key里面,value是無效值---在源碼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);
//}
}
}到此這篇關于Java中Comparable和Comparator兩種比較器的區(qū)別詳解的文章就介紹到這了,更多相關Comparable和Comparator比較器的區(qū)別內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
SpringBoot將所有依賴(包括本地jar包)打包到項目
這篇文章主要介紹了SpringBoot將所有依賴(包括本地jar包)打包到項目,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-06-06
詳解在idea 中使用Mybatis Generator逆向工程生成代碼
這篇文章主要介紹了在idea 中使用Mybatis Generator逆向工程生成代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-12-12
mybatis-plus 攔截器敏感字段加解密的實現(xiàn)
數(shù)據(jù)庫在保存數(shù)據(jù)時,對于某些敏感數(shù)據(jù)需要脫敏或者加密處理,本文主要介紹了mybatis-plus 攔截器敏感字段加解密的實現(xiàn),感興趣的可以了解一下2021-11-11

