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

服務(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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 爱情岛论坛亚洲一号路线 | 青草午夜精品视频在线观看 | 欧美精品99 | 日日操美女 | 91爱爱网站 | 精品一二三区久久AAA片 | 日本大学jalapsikix | 手机看片一区二区 | 国产成人精品一区 | 青青网在线视频 | 亚洲精品久久7777777 | 久久理论片迅播影院一级 | 国产拍拍拍| 国内免费高清视频在线观看 | 亚洲国产99999在线精品一区 | 国内精品久久久久久久久久久久 | avav一区 | 99亚洲 | 男女被爆动漫羞羞动漫 | 国产日韩欧美 | futa文| 猫咪社区免费资源在线观看 | 美女脱了内裤打开腿让男人图片 | 国产精品美女久久久久网站 | 欧美一级欧美三级在线 | 91视频完整版 | 精品无码久久久久久久动漫 | ysav67| 99精品热线在线观看免费视频 | 国产美女在线一区二区三区 | 亚洲国产综合久久久无码色伦 | 黑人巨大初黑人解禁作品 | 色猪视频 | 久久综合香蕉久久久久久久 | 亚洲男女网站 | 久久伊人影视 | 吻戏辣妞范1000免费体验 | 精品国产自在现线久久 | 全黄一级裸片视频免费 | 门房秦大爷在线阅读 | 精品网站一区二区三区网站 |