欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中Comparable和Comparator兩種比較器的區(qū)別詳解

 更新時(shí)間:2023年09月19日 09:48:15   作者:強(qiáng)欽欽  
這篇文章主要介紹了Java中Comparable和Comparator兩種比較器的區(qū)別詳解,Comparable接口將比較代碼嵌入自身類中,像Integer、String等這些基本類型的JAVA封裝類都已經(jīng)實(shí)現(xiàn)了Comparable接口,這些類對(duì)象本身就支持和自己比較,需要的朋友可以參考下

Comparable接口

  • 內(nèi)比較器 ,位于包java.util
  • 自然排序(natural ordering)。compareTo方法也被稱為自然比較方法。
  • Comparable接口將比較代碼嵌入自身類中。像Integer、String等這些基本類型的JAVA封裝類都已經(jīng)實(shí)現(xiàn)了Comparable接口,這些類對(duì)象本身就支持和自己比較,直接調(diào)用Collections.sort()就可以對(duì)集合中元素的排序,無需自己去實(shí)現(xiàn)Comparable接口。

Comparator接口

  • 外比較器,位于包java.lang
  • Comparator也叫臨時(shí)規(guī)則排序,也稱作專門規(guī)則排序
  • 在一個(gè)獨(dú)立的類中專門實(shí)現(xiàn)比較。
  • 場景:
    • 一個(gè)對(duì)象不支持自己和自己比較(沒有實(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);
* 基于哈希表和紅黑樹 ,而哈希表用來保證元素的唯一性、 紅黑樹保證元素的有序。有序可以是:
* 	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("中國");
//
//        //遍歷元素,這里默認(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) {
                //按照姓名長度 由短到長排序
                //如果姓名長度相同,則按照年齡從小到大排序
                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是無效值---在源碼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)文章

  • Java中的異步非阻塞AIO模型詳解

    Java中的異步非阻塞AIO模型詳解

    這篇文章主要介紹了Java中的異步非阻塞AIO模型詳解,AIO需要操作系統(tǒng)的支持,在linux內(nèi)核2.6版本中加入了對(duì)真正異步IO的支持,java從jdk1.7開始支持AIO,本文提供了部分實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2023-09-09
  • Java選擇排序和垃圾回收機(jī)制詳情

    Java選擇排序和垃圾回收機(jī)制詳情

    這篇文章主要介紹Java選擇排序和垃圾回收機(jī)制,創(chuàng)建對(duì)象就會(huì)占據(jù)內(nèi)存,如果程序在執(zhí)行過程中不能再使用某個(gè)對(duì)象,這個(gè)對(duì)象是徒耗內(nèi)存的垃圾,下面來看看文章具體內(nèi)容吧
    2021-10-10
  • java.time包時(shí)間類的具體使用

    java.time包時(shí)間類的具體使用

    本文主要介紹了java.time包時(shí)間類的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • java實(shí)現(xiàn)文件上傳和下載

    java實(shí)現(xiàn)文件上傳和下載

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)文件上傳和下載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Java 關(guān)于eclipse導(dǎo)入項(xiàng)目發(fā)生的問題及解決方法(推薦)

    Java 關(guān)于eclipse導(dǎo)入項(xiàng)目發(fā)生的問題及解決方法(推薦)

    下面小編就為大家分享一篇Java 關(guān)于eclipse導(dǎo)入項(xiàng)目發(fā)生的問題及解決方法(推薦),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12
  • java 中用split分割字符串,最后的空格等不被拆分的方法

    java 中用split分割字符串,最后的空格等不被拆分的方法

    下面小編就為大家?guī)硪黄猨ava 中用split分割字符串,最后的空格等不被拆分的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-02-02
  • Spring boot2基于Mybatis實(shí)現(xiàn)多表關(guān)聯(lián)查詢

    Spring boot2基于Mybatis實(shí)現(xiàn)多表關(guān)聯(lián)查詢

    這篇文章主要介紹了Spring boot2基于Mybatis實(shí)現(xiàn)多表關(guān)聯(lián)查詢,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • springboot實(shí)現(xiàn)分頁功能的完整代碼

    springboot實(shí)現(xiàn)分頁功能的完整代碼

    Spring Boot是一個(gè)快速開發(fā)框架,它提供了很多便捷的功能,其中包括分頁查詢,下面這篇文章主要給大家介紹了關(guān)于springboot實(shí)現(xiàn)分頁功能的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-04-04
  • 員工管理系統(tǒng)java版

    員工管理系統(tǒng)java版

    這篇文章主要為大家詳細(xì)介紹了java版的員工管理系統(tǒng),,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-11-11
  • Java編寫多功能萬年歷程序的實(shí)例分享

    Java編寫多功能萬年歷程序的實(shí)例分享

    這里我們來作一個(gè)Java編寫多功能萬年歷程序的實(shí)例分享,可以查詢公元?dú)v、農(nóng)歷、節(jié)氣與節(jié)日等,十分全面,下面就來具體看一下:
    2016-06-06

最新評(píng)論