亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解java對象的比較

發布時間:2021-10-23 10:24:11 來源:億速云 閱讀:175 作者:iii 欄目:開發技術

這篇文章主要講解了“如何理解java對象的比較”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何理解java對象的比較”吧!

目錄
  • 1、元素的比較

  • 2、類的比較

  • 3、比較方法

    • 3.1 重寫equals方法

    • 3.2 基于Comparble接口類的比較

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

    • 3.4 三種比較方式的對比

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);

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

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

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

如何理解java對象的比較

2、類的比較

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

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指向的是不同對象
    }
}

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

此方法的比較規則是:

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

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

3、比較方法

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

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方法實現如下:

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

3.2 基于Comparble接口類的比較

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

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

對于用戶自定義類型,如果按照大小與方式進行比較:可以在定義類的時候實現接口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 比較大
    }
    }

如何理解java對象的比較

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

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

  • 戶自定義比較器類,實現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)); 
    }
}

如何理解java對象的比較

3.4 三種比較方式的對比

如何理解java對象的比較

感謝各位的閱讀,以上就是“如何理解java對象的比較”的內容了,經過本文的學習后,相信大家對如何理解java對象的比較這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

嘉义市| 襄垣县| 泰来县| 上蔡县| 勃利县| 盱眙县| 陇西县| 怀化市| 舟曲县| 夏津县| 西充县| 镇赉县| 灵台县| 平罗县| 克东县| 安图县| 石首市| 新蔡县| 天等县| 平泉县| 黎城县| 左权县| 介休市| 长白| 澄城县| 改则县| 瑞丽市| 恩平市| 固始县| 原平市| 禄劝| 汕尾市| 沧州市| 蒙山县| 麻阳| 井冈山市| 敖汉旗| 垫江县| 隆德县| 鸡西市| 水城县|