亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

淺談java對象的比較

 更新時間:2021年10月22日 17:02:46   作者:文墨軒  
這篇文章主要給大家分享java對象的比較,主要有元素的比較、類的比較及比較的方法,想具體了解的小伙伴和小編一起進入下面文章內(nèi)容吧

1、元素的比較

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

public static void main(String[] args) {
        int a=12;
        int b=55;
        System.out.println(a > b);
        System.out.println(a == b);
        System.out.println(a<b);

        //字符的比較根據(jù)字符所對應(yīng)ASCII值來比較大小
        char ch1='a';
        char ch2='b';
        char ch3='c';
        System.out.println(ch1>ch2);
        System.out.println(ch1==ch2);
        System.out.println(ch1<ch2);

        boolean b1=true;
        boolean b2=false;
        System.out.println(b1==b2);
        System.out.println(b1!=b2);
    }

對于String類的比較可以參考我之前寫的博客:初識javaString

2、類的比較

對于類的比較如果直接像元素比較一樣可能會造成編譯錯誤或者與預(yù)期效果的不一樣。

class Card{
    public int rank;
    public String suit;
    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }
}
public class Main{
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);//打印false,因為c1和c2指向的是不同對象
    }
}

從此編譯結(jié)果中我們可以發(fā)現(xiàn),java中引用類型的變量不能直接按照> 或者< 方式進行比較,但確可以使用==符號進行比較?
原因:對于用戶自己實現(xiàn)定義的類型,都是默認為Object類,Object類提供了equal方法,

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

無比較引用變量引用對象的內(nèi)容,而是直接比較引用變量的地址,因此equal方法一般在使用的時候會被重寫

// Object中equal的實現(xiàn),可以看到:直接比較的是兩個引用變量的地址
public boolean equals(Object obj) {
        return (this == obj);
    }

3、比較方法

在一些情況下,我們需要比較的是對象的內(nèi)容,而不是比較對象的地址是否相同,則需要重寫比較方法。

3.1 重寫equals方法

class Card{
    public int rank;
    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;
        Card card = (Card) o;
        return rank == card.rank && Objects.equals(suit, card.suit);
    }
}
Public class Main{
public static void main(String[] args){
  Card c1 = new Card(1, "♠");
        Card c2 = new Card(1, "♠");
        System.out.println(c1.equals(c2));
}
}

equal方法實現(xiàn)如下:

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

3.2 基于Comparble接口類的比較

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

public interface Comparable<E>{
// 返回值:
// < 0: 表示 this 指向的對象小于 o 指向的對象
// == 0: 表示 this 指向的對象等于 o 指向的對象
// > 0: 表示 this 指向的對象等于 o 指向的對象
public int compareTo(T o);
}

對于用戶自定義類型,如果按照大小與方式進行比較:可以在定義類的時候?qū)崿F(xiàn)接口Comparable,并在類中重寫compareTo方法。

class Card implements Comparable<Card>{
    public int rank;
    public String suit;
    public Card(int rank, String suit) {
        this.rank = rank;
        this.suit = suit;
    }

    @Override
    public int compareTo(Card o) {
        return this.rank-o.rank;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || !(o instanceof Card)) return false;
        Card card = (Card) o;
        return rank == card.rank && Objects.equals(suit, card.suit);
    }
}
public class Main {
    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 比較大
    }
    }

3.3 基于比較器比較基于比較器比較:Comparator接口

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

  • 戶自定義比較器類,實現(xiàn)Comparator接口
  • 覆寫Comparator中的compare方法
class Card{
    public int rank;
    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;
        if (o == null || !(o instanceof Card)) return false;
        Card card = (Card) o;
        return rank == card.rank && Objects.equals(suit, card.suit);
    }
}
class CardComparator implements Comparator<Card>{
    @Override
    // 返回值:
    // < 0: 表示 o1 指向的對象小于 o2 指向的對象
    // == 0: 表示 o1 指向的對象等于 o2 指向的對象
    // > 0: 表示 o1 指向的對象等于 o2 指向的對象
    public int compare(Card o1, Card o2) {
       if (o1 == o2) {
            return 0;
        }
        //判斷o1是否為空
        if (o1 == null) {
            return -1;
        }
        //判斷o2是否為空
        if (o2 == null) {
            return 1;
        }
        return o1.rank - o2.rank;
    }
}
public class Main {
     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();
        // 使用比較器對象進行比較
        // == 0,表示牌相等
        System.out.println(cmptor.compare(p, o)); 
        // < 0,表示 p 比較小
        System.out.println(cmptor.compare(p, q)); 
        // > 0,表示 q 比較大
        System.out.println(cmptor.compare(q, p)); 
    }
}

3.4 三種比較方式的對比


到此這篇關(guān)于淺談java對象的比較的文章就介紹到這了,更多相關(guān)java對象的比較內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Spring整合Mybatis具體代碼實現(xiàn)流程

    Spring整合Mybatis具體代碼實現(xiàn)流程

    這篇文章主要介紹了Spring整合Mybatis實操分享,文章首先通過介紹Mybatis的工作原理展開Spring整合Mybatis的詳細內(nèi)容,需要的小伙伴可以參考一下
    2022-05-05
  • velocity顯示List與Map的方法詳細解析

    velocity顯示List與Map的方法詳細解析

    以下是對velocity顯示List與Map的方法進行了詳細的介紹。需要的朋友可以過來參考下
    2013-08-08
  • SpringBoot實現(xiàn)異步事件Event詳解

    SpringBoot實現(xiàn)異步事件Event詳解

    這篇文章主要介紹了SpringBoot實現(xiàn)異步事件Event詳解,異步事件的模式,通常將一些非主要的業(yè)務(wù)放在監(jiān)聽器中執(zhí)行,因為監(jiān)聽器中存在失敗的風(fēng)險,所以使用的時候需要注意,需要的朋友可以參考下
    2023-11-11
  • Spring容器擴展機制的實現(xiàn)原理

    Spring容器擴展機制的實現(xiàn)原理

    這篇文章主要介紹了Spring容器擴展機制的實現(xiàn)原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-11-11
  • 詳談springboot過濾器和攔截器的實現(xiàn)及區(qū)別

    詳談springboot過濾器和攔截器的實現(xiàn)及區(qū)別

    今天小編就為大家分享一篇詳談springboot過濾器和攔截器的實現(xiàn)及區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-08-08
  • Java8新特性之Optional使用詳解

    Java8新特性之Optional使用詳解

    這篇文章主要介紹了Java8新特性之Optional使用詳解,為了解決空指針異常更加優(yōu)雅,Java8?提供了?Optional?類庫,Optional?實際上是個容器,它可以保存類型T的值,或者僅僅保存null,,需要的朋友可以參考下
    2023-08-08
  • JSP服務(wù)器端和前端出現(xiàn)亂碼問題解決方案

    JSP服務(wù)器端和前端出現(xiàn)亂碼問題解決方案

    這篇文章主要介紹了JSP服務(wù)器端和前端出現(xiàn)亂碼問題解決方案,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • 非常詳細的Java異常處理機制知識整理大全

    非常詳細的Java異常處理機制知識整理大全

    Java異常指在程序運行時可能出現(xiàn)的一些錯誤,比如試圖打開一個根本不存在的文件等,異常處理將會改變程序的控制流程,讓程序有機會對錯誤做出處理,下面這篇文章主要給大家介紹了關(guān)于Java異常處理機制知識整理的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Springboot配置Swagger2登錄密碼的實現(xiàn)

    Springboot配置Swagger2登錄密碼的實現(xiàn)

    本文主要介紹了Springboot配置Swagger2登錄密碼的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Java的Tomcat和Servlet的運行原理詳解

    Java的Tomcat和Servlet的運行原理詳解

    這篇文章主要為大家詳細介紹了Java的Tomcat和Servlet,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03

最新評論