淺談java對(duì)象的比較
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í)java
的String
類
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接口類的比較
Comparble
是JDK
提供的泛型的比較接口類,源碼實(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 比較大 } }
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)); } }
3.4 三種比較方式的對(duì)比
到此這篇關(guān)于淺談java對(duì)象的比較的文章就介紹到這了,更多相關(guān)java對(duì)象的比較內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Spring整合Mybatis具體代碼實(shí)現(xiàn)流程
這篇文章主要介紹了Spring整合Mybatis實(shí)操分享,文章首先通過(guò)介紹Mybatis的工作原理展開(kāi)Spring整合Mybatis的詳細(xì)內(nèi)容,需要的小伙伴可以參考一下2022-05-05SpringBoot實(shí)現(xiàn)異步事件Event詳解
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)異步事件Event詳解,異步事件的模式,通常將一些非主要的業(yè)務(wù)放在監(jiān)聽(tīng)器中執(zhí)行,因?yàn)楸O(jiān)聽(tīng)器中存在失敗的風(fēng)險(xiǎn),所以使用的時(shí)候需要注意,需要的朋友可以參考下2023-11-11Spring容器擴(kuò)展機(jī)制的實(shí)現(xiàn)原理
這篇文章主要介紹了Spring容器擴(kuò)展機(jī)制的實(shí)現(xiàn)原理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11詳談springboot過(guò)濾器和攔截器的實(shí)現(xiàn)及區(qū)別
今天小編就為大家分享一篇詳談springboot過(guò)濾器和攔截器的實(shí)現(xiàn)及區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-08-08JSP服務(wù)器端和前端出現(xiàn)亂碼問(wèn)題解決方案
這篇文章主要介紹了JSP服務(wù)器端和前端出現(xiàn)亂碼問(wèn)題解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02非常詳細(xì)的Java異常處理機(jī)制知識(shí)整理大全
Java異常指在程序運(yùn)行時(shí)可能出現(xiàn)的一些錯(cuò)誤,比如試圖打開(kāi)一個(gè)根本不存在的文件等,異常處理將會(huì)改變程序的控制流程,讓程序有機(jī)會(huì)對(duì)錯(cuò)誤做出處理,下面這篇文章主要給大家介紹了關(guān)于Java異常處理機(jī)制知識(shí)整理的相關(guān)資料,需要的朋友可以參考下2022-11-11Springboot配置Swagger2登錄密碼的實(shí)現(xiàn)
本文主要介紹了Springboot配置Swagger2登錄密碼的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03Java的Tomcat和Servlet的運(yùn)行原理詳解
這篇文章主要為大家詳細(xì)介紹了Java的Tomcat和Servlet,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2022-03-03