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

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

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

1、元素的比較

java中,基本類(lèi)型的對(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類(lèi)的比較可以參考我之前寫(xiě)的博客:初識(shí)javaString類(lèi)

2、類(lèi)的比較

對(duì)于類(lèi)的比較如果直接像元素比較一樣可能會(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中引用類(lèi)型的變量不能直接按照> 或者< 方式進(jìn)行比較,但確可以使用==符號(hào)進(jìn)行比較?
原因:對(duì)于用戶自己實(shí)現(xiàn)定義的類(lèi)型,都是默認(rèn)為Object類(lèi),Object類(lèi)提供了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的子類(lèi)
        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è)類(lèi)指向同一個(gè)對(duì)象則直接返回true;
如果傳入的為空或者其對(duì)象類(lèi)型不是Card,則返回false
按照類(lèi)的實(shí)現(xiàn)目標(biāo)完成比較,這里只要花色和數(shù)值一樣,就認(rèn)為是相同的牌
注意下調(diào)用其他引用類(lèi)型的比較也需要 equals,例如這里的 suit 的比較

3.2 基于Comparble接口類(lèi)的比較

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

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

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

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

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


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

相關(guān)文章

  • java判斷各類(lèi)型字符個(gè)數(shù)實(shí)例代碼

    java判斷各類(lèi)型字符個(gè)數(shù)實(shí)例代碼

    大家好,本篇文章主要講的是java判斷各類(lèi)型字符個(gè)數(shù)實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Java8 用Lambda表達(dá)式給List集合排序的實(shí)現(xiàn)

    Java8 用Lambda表達(dá)式給List集合排序的實(shí)現(xiàn)

    這篇文章主要介紹了Java8 用Lambda表達(dá)式給List集合排序的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • Java 數(shù)據(jù)庫(kù)連接池 DBCP 的介紹

    Java 數(shù)據(jù)庫(kù)連接池 DBCP 的介紹

    這篇文章主要給大家分享的是 Java 數(shù)據(jù)庫(kù)連接池 DBCP 的介紹, 是 Apache 旗下 Commons 項(xiàng)目下的一個(gè)子項(xiàng)目,提供連接池功能DBCP,下面來(lái)看看文章的具體介紹內(nèi)容吧,需要的朋友可以參考一下
    2021-11-11
  • 在Java中實(shí)現(xiàn)線程安全的單例模式的常見(jiàn)方式

    在Java中實(shí)現(xiàn)線程安全的單例模式的常見(jiàn)方式

    單例模式是一種常用的軟件設(shè)計(jì)模式,它確保一個(gè)類(lèi)只有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)點(diǎn),在多線程環(huán)境下,確保單例模式的線程安全性是非常重要的,因?yàn)槎鄠€(gè)線程可能會(huì)同時(shí)嘗試創(chuàng)建實(shí)例,導(dǎo)致實(shí)例不唯一的問(wèn)題,本文介紹了在Java中實(shí)現(xiàn)線程安全的單例模式有幾種常見(jiàn)的方式
    2024-09-09
  • Springboot創(chuàng)建項(xiàng)目的圖文教程(idea版本)

    Springboot創(chuàng)建項(xiàng)目的圖文教程(idea版本)

    這篇文章主要介紹了Springboot創(chuàng)建項(xiàng)目的圖文教程(idea版本),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-06-06
  • idea多環(huán)境配置及問(wèn)題解決方案

    idea多環(huán)境配置及問(wèn)題解決方案

    這篇文章主要介紹了idea多環(huán)境配置及問(wèn)題解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 一個(gè)簡(jiǎn)單的Java文件讀取的進(jìn)度條

    一個(gè)簡(jiǎn)單的Java文件讀取的進(jìn)度條

    這篇文章主要介紹了一個(gè)簡(jiǎn)單的Java文件讀取的進(jìn)度條,寫(xiě)一個(gè)可以使用的?demo,涉及到了文件的相對(duì)路徑問(wèn)題,需要的朋友可以參考下
    2023-04-04
  • java實(shí)現(xiàn)2048小游戲(含注釋)

    java實(shí)現(xiàn)2048小游戲(含注釋)

    這篇文章主要為大家介紹了java實(shí)現(xiàn)2048小游戲,含詳細(xì)注釋?zhuān)闹惺纠a介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04
  • java?Date和SimpleDateFormat時(shí)間類(lèi)詳解

    java?Date和SimpleDateFormat時(shí)間類(lèi)詳解

    這篇文章主要介紹了java?Date和SimpleDateFormat時(shí)間類(lèi)詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-08-08
  • Java如何使用遞歸查詢(xún)多級(jí)樹(shù)形結(jié)構(gòu)數(shù)據(jù)(多級(jí)菜單)

    Java如何使用遞歸查詢(xún)多級(jí)樹(shù)形結(jié)構(gòu)數(shù)據(jù)(多級(jí)菜單)

    這篇文章主要介紹了Java如何使用遞歸查詢(xún)多級(jí)樹(shù)形結(jié)構(gòu)數(shù)據(jù)(多級(jí)菜單),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-07-07

最新評(píng)論

大连市| 青田县| 晋江市| 福建省| 洛扎县| 泗洪县| 崇义县| 临沂市| 勃利县| 乡宁县| 合作市| 玉门市| 湘潭县| 阜新市| 斗六市| 宁陕县| 金堂县| 方城县| 英超| 扶沟县| 西林县| 涞源县| 得荣县| 塔河县| 洪江市| 天峻县| 开原市| 文登市| 台江县| 安福县| 平江县| 师宗县| 贺兰县| 辽源市| 罗源县| 攀枝花市| 新丰县| 尚义县| 彩票| 蒙阴县| 新宁县|