一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 淺談java對(duì)象的比較

淺談java對(duì)象的比較

2022-02-25 13:35文墨軒 Java教程

這篇文章主要給大家分享java對(duì)象的比較,主要有元素的比較、類的比較及比較的方法,想具體了解的小伙伴和小編一起進(jìn)入下面文章內(nèi)容吧

 

1、元素的比較

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

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ù)字符所對(duì)應(yīng)ASCII值來(lái)比較大小
        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);
    }

對(duì)于String類的比較可以參考我之前寫(xiě)的博客:初識(shí)javaString

淺談java對(duì)象的比較

 

2、類的比較

對(duì)于類的比較如果直接像元素比較一樣可能會(huì)造成編譯錯(cuò)誤或者與預(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);編譯報(bào)錯(cuò)
        System.out.println(c1==c2);//打印false,因?yàn)閏1和c2指向的是不同對(duì)象
//        System.out.println(c1<c2);編譯報(bào)錯(cuò)
        System.out.println(c1==c3);//打印false,因?yàn)閏1和c2指向的是不同對(duì)象
    }
}

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

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

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

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

 

3、比較方法

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

 

3.1 重寫(xiě)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對(duì)象,或者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方法實(shí)現(xiàn)如下:

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

 

3.2 基于Comparble接口類的比較

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

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

對(duì)于用戶自定義類型,如果按照大小與方式進(jìn)行比較:可以在定義類的時(shí)候?qū)崿F(xiàn)接口Comparable,并在類中重寫(xiě)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 比較大
    }
    }

淺談java對(duì)象的比較

 

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

按照比較器方式進(jìn)行比較,具體步驟如下:

  • 戶自定義比較器類,實(shí)現(xiàn)Comparator接口
  • 覆寫(xiě)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 指向的對(duì)象小于 o2 指向的對(duì)象
    // == 0: 表示 o1 指向的對(duì)象等于 o2 指向的對(duì)象
    // > 0: 表示 o1 指向的對(duì)象等于 o2 指向的對(duì)象
    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, "♠");
        //定義比較器對(duì)象
        CardComparator cmptor = new CardComparator();
        // 使用比較器對(duì)象進(jìn)行比較
        // == 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)); 
    }
}

淺談java對(duì)象的比較

 

3.4 三種比較方式的對(duì)比

淺談java對(duì)象的比較

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

原文鏈接:https://blog.csdn.net/weixin_49830664/article/details/120817550

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 天天色天天综合 | 亚洲成a人不卡在线观看 | 国产va欧美va在线观看 | 30分钟的高清视频在线观看 | 国产免费丝袜调教视频 | 9久re热视频这里只有精品 | 深夜免费网站 | 啊用力好大粗黑人小说 | freesex性欧美炮机喷潮 | 国产精品成人免费 | 无敌在线视频观看免费 | 美女脱了内裤打开腿让男人图片 | 毛茸茸的大逼 | 大吊小说 | 日本无遮挡吸乳视频看看 | chinese老太grandma| 国产免费久久精品 | a在线观看欧美在线观看 | 日韩亚洲人成在线综合 | 国产成人夜色91 | 亚洲 欧美 国产 日韩 字幕 | 日本小网站 | 午夜爱 | 亚洲午夜精品久久久久久人妖 | 五月天精品视频播放在线观看 | 帅老头恋帅老头同性tv | 含羞草传媒每天免费一次破解 | 免费观看二十女人一摸是水 | 亚洲一二三区视频 | 国产精品久久久久久影视 | 日本在线你懂的 | 四虎永久在线精品国产 | 国产大胆歌舞团网站 | 亚洲欧美日本在线观看 | 刺激一区仑乱 | 免费又爽又黄禁片视频在线播放 | 青青草视频国产 | 大伊香蕉精品二区视频在线 | beeg最新| 黄在线观看www免费看 | 给我免费观看的视频在线播放 |