最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java數(shù)據(jù)結(jié)構(gòu)之對象的比較

 更新時間:2022年02月17日 09:55:33   作者:敲代碼的布萊恩特  
比較對象是面向?qū)ο缶幊陶Z言的一個基本特征,下面這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之對象的比較,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下

??元素比較

??基本類型的比較

在Java中,基本類型的對象可以直接比較大小

public class TestCompare { 
  public static void main(String[] args) {
     int a = 10;
     int b = 20;
     System.out.println(a > b); 
     System.out.println(a < b); 
     System.out.println(a == b);
     char c1 = 'A'; char c2 = 'B';
     System.out.println(c1 > c2);
     System.out.println(c1 < c2);
     System.out.println(c1 == c2);
     boolean b1 = true; boolean b2 = false; 
     System.out.println(b1 == b2); 
     System.out.println(b1 != b2); 
   } 
}

??對象的比較

先來看一段代碼

class Card {
    public int rank; // 數(shù)值 
    public String suit; // 花色 

    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }
}

public class TestPriorityQueue {
    public static void main(String[] args) {
        Card c1 = new Card(1, "?");
        Card c2 = new Card(2, "?");
        Card c3 = c1;
        
        //System.out.println(c1 > c2); // 編譯報錯 
        System.out.println(c1 == c2);
        // 編譯成功 ----> 打印false,因為c1和c2指向的是不同對象 

        //System.out.println(c1 < c2); // 編譯報錯 
        System.out.println(c1 == c3);
        // 編譯成功 ----> 打印true,因為c1和c3指向的是同一個對象 
    }
}

c1、c2和c3分別是Card類型的引用變量,上述代碼在比較編譯時:

c1 > c2 編譯失敗c1== c2 編譯成功c1 < c2 編譯失敗

從編譯結(jié)果可以看出,Java中引用類型的變量不能直接按照 > 或者 < 方式進行比較。

那為什么== 可以比較?

因為:對于用戶實現(xiàn)自定義類型,都默認繼承自Object類,而Object類中提供了equal方法,而 equal方法 在不覆寫的情況下,默認用的就是 ==

該方法的比較規(guī)則是:

沒有比較引用變量引用對象的內(nèi)容,而是直接比較引用變量的地址

但有些情況下用equals方法來比較就不符合題意。需要進行覆寫,修改成我們所需要的比較方法

??對象如何進行比較

有些情況下,需要比較的是對象中的內(nèi)容,比如:

向優(yōu)先級隊列中插入某個對象時,需要堆按照對象中內(nèi)容來調(diào)整堆,那該如何處理呢?

以下提供三種比較對象的方式

??覆寫基類的equal

public class Card {
    public int rank; // 數(shù)值
    public String suit; // 花色
    public Card(int rank, String suit) {
        this.rank = rank; this.suit = suit;
    }
    @Override public boolean equals(Object o) {
        // 自己和自己比較
        if (this == o) {
            return true;
        }
        // o如果是null對象,或者o不是Card的子類
        if (o == null || !(o instanceof Card)) {
            return false;
        }// 注意基本類型可以直接比較,但引用類型最好調(diào)用其equal方法
        Card c = (Card)o;
        return rank == c.rank && suit.equals(c.suit);
    }
}

注意: 一般覆寫 equals 的套路就是上面演示的

  • 如果指向同一個對象,返回 true
  • 如果傳入的為 null,返回 false
  • 如果傳入的對象類型不是 Card,返回 false
  • 按照類的實現(xiàn)目標完成比較,例如這里只要花色和數(shù)值一樣,就認為是相同的牌
  • 注意下調(diào)用其他引用類型的比較也需要 equals,例如這里的 suit 的比較

覆寫基類equal的方式雖然可以比較,但缺陷是:equal只能按照相等進行比較,不能按照大于、小于的方式進行比較。

??基于Comparble接口類的比較

Comparble是JDK提供的泛型的比較接口類,源碼實現(xiàn)具體如下:

對用用戶自定義類型,如果要想按照大小與方式進行比較時:在定義類時,實現(xiàn)Comparble接口即可,然后在類中重寫compareTo方法。

public class Card implements Comparable<Card> {
    public int rank;    // 數(shù)值 
    public String suit; // 花色 

    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }

    // 根據(jù)數(shù)值比較,不管花色 
    // 這里我們認為 null 是最小的 
    @Override
    public int compareTo(Card o) {
        if (o == null) {
            return 1;
        }
        return rank - o.rank;
    }

    public static void main(String[] args) {
        Card p = new Card(1, "?");
        Card q = new Card(2, "?");
        Card o = new Card(1, "?");
        System.out.println(p.compareTo(o));
        // == 0,表示牌相等 System.out.println(p.compareTo(q));
        // < 0,表示 p 比較小 System.out.println(q.compareTo(p));
        // > 0,表示 q 比較大
    }
}

Compareble是java.lang中的接口類,可以直接使用

??基于比較器的比較

Comparator接口源碼如下:

按照比較器方式進行比較,具體步驟如下:

用戶自定義比較器類,實現(xiàn)Comparator接口

class CardComparator implements Comparator<Card> {
    // 根據(jù)數(shù)值比較,不管花色 
    // 這里我們認為 null 是最小的
    ********************
    //覆寫代碼區(qū)
    ********************
}

注意:區(qū)分Comparable和Comparator。

覆寫Comparator中的compare方法

@Override
    public int compare(Card o1, Card o2) {
        if (o1 == o2) {
            return 0;
        }
        if (o1 == null) {
            return -1;
        }
        if (o2 == null) {
            return 1;
        }
        return o1.rank - o2.rank;
    }

調(diào)用自定義的比較器

public static void main(String[] args){
        Card p = new Card(1, "?");
        Card q = new Card(2, "?");
        Card o = new Card(1, "?"); // 定義比較器對象 
        CardComparator cmptor = new CardComparator();
        // 使用比較器對象進行比較 
        System.out.println(cmptor.compare(p, o)); // == 0,表示牌相等 
        System.out.println(cmptor.compare(p, q)); // < 0,表示 p 比較小 
        System.out.println(cmptor.compare(q, p)); // > 0,表示 q 比較大
    }

注意Comparator是java.util 包中的泛型接口類,使用時必須導入對應的包。

??三種比較方式對比

覆寫的方法說明
Object.equals因為所有類都是繼承自 Object 的,所以直接覆寫即可,不過只能比較相等與否
Comparable.compareTo需要手動實現(xiàn)接口,侵入性比較強,但一旦實現(xiàn),每次用該類都有順序,屬于內(nèi)部順序
Comparator.compare需要實現(xiàn)一個比較器對象,對待比較類的侵入性弱,但對算法代碼實現(xiàn)侵入性強

??集合框架中PriorityQueue(優(yōu)先級隊列)的比較方式

集合框架中的PriorityQueue底層使用堆結(jié)構(gòu),因此其內(nèi)部的元素必須要能夠比大小,PriorityQueue采用了:Comparble和Comparator兩種方式。

Comparble是默認的內(nèi)部比較方式,如果用戶插入自定義類型對象時,該類對象必須要實現(xiàn)Comparble接口,并覆寫compareTo方法

用戶也可以選擇使用比較器對象,如果用戶插入自定義類型對象時必須要提供一個比較器類,讓該類實現(xiàn)Comparator接口并覆寫compare方法。

總結(jié)

到此這篇關(guān)于Java數(shù)據(jù)結(jié)構(gòu)之對象比較的文章就介紹到這了,更多相關(guān)Java對象的比較內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java原生HttpClient的使用詳解

    Java原生HttpClient的使用詳解

    Java開發(fā)語言中實現(xiàn)HTTP請求的方法主要有兩種:一種是JAVA的標準類HttpUrlConnection,比較原生的實現(xiàn)方法;另一種是第三方開源框架HTTPClient。本文就將詳細講講Java中原生HttpClient的使用,需要的可以參考一下
    2022-04-04
  • SpringCloud?LoadBalancerClient?負載均衡原理解析

    SpringCloud?LoadBalancerClient?負載均衡原理解析

    LoadBalancerClient?是?SpringCloud?提供的一種負載均衡客戶端,Ribbon?負載均衡組件內(nèi)部也是集成了?LoadBalancerClient?來實現(xiàn)負載均衡,本文給大家深入解析?LoadBalancerClient?接口源碼,感興趣的朋友跟隨小編一起看看吧
    2022-02-02
  • 淺談SpringMVC的攔截器(Interceptor)和Servlet 的過濾器(Filter)的區(qū)別與聯(lián)系 及SpringMVC 的配置文件

    淺談SpringMVC的攔截器(Interceptor)和Servlet 的過濾器(Filter)的區(qū)別與聯(lián)系 及Spr

    這篇文章主要介紹了淺談SpringMVC的攔截器(Interceptor)和Servlet 的過濾器(Filter)的區(qū)別與聯(lián)系 及SpringMVC 的配置文件,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Java工廠模式定義與用法實例分析

    Java工廠模式定義與用法實例分析

    這篇文章主要介紹了Java工廠模式定義與用法,結(jié)合具體實例形式分析了java工廠模式定義、使用相關(guān)操作技巧,并總結(jié)了類圖原理,需要的朋友可以參考下
    2019-07-07
  • MyBatis實現(xiàn)插入大量數(shù)據(jù)方法詳解

    MyBatis實現(xiàn)插入大量數(shù)據(jù)方法詳解

    最近在公司項目開發(fā)中遇到批量數(shù)據(jù)插入或者更新,下面這篇文章主要給大家介紹了關(guān)于MyBatis實現(xiàn)批量插入的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • idea中java及java web項目的常見問題及解決

    idea中java及java web項目的常見問題及解決

    在IDEA中處理亂碼問題主要涉及四個方面:文件編碼設置為UTF-8、編輯器默認編碼調(diào)整、Tomcat運行配置編碼設置以及解決cmd中的亂碼,此外,詳細介紹了在IDEA中創(chuàng)建Web項目的步驟,包括新建Java工程、添加Web框架支持、添加Tomcat依賴庫
    2024-09-09
  • Spring中ApplicationListener的使用解析

    Spring中ApplicationListener的使用解析

    這篇文章主要介紹了Spring中ApplicationListener的使用解析,ApplicationContext事件機制是觀察者設計模式的實現(xiàn),通過ApplicationEvent類和ApplicationListener接口,需要的朋友可以參考下
    2023-12-12
  • 談談Hashmap的容量為什么是2的冪次問題

    談談Hashmap的容量為什么是2的冪次問題

    這篇文章主要介紹了談談Hashmap的容量為什么是2的冪次問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 如何批量測試Mybatis項目中的Sql是否正確詳解

    如何批量測試Mybatis項目中的Sql是否正確詳解

    這篇文章主要給大家介紹了關(guān)于如何批量測試Mybatis項目中Sql是否正確的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • Mybatis Criteria使用and和or進行聯(lián)合條件查詢的操作方法

    Mybatis Criteria使用and和or進行聯(lián)合條件查詢的操作方法

    這篇文章主要介紹了Mybatis Criteria的and和or進行聯(lián)合條件查詢的方法,本文通過例子給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-10-10

最新評論

海兴县| 九寨沟县| 贵阳市| 徐水县| 南宁市| 小金县| 遂溪县| 信阳市| 东城区| 陆河县| 巨鹿县| 临沂市| 德江县| 武乡县| 日照市| 松潘县| 罗城| 黄石市| 永寿县| 石狮市| 清河县| 吉林省| 瑞昌市| 迭部县| 买车| 清原| 化州市| 沅江市| 东海县| 综艺| 潮安县| 资溪县| 崇义县| 连城县| 林州市| 兴化市| 兴海县| 长泰县| 洱源县| 大石桥市| 张北县|