淺談java對象的比較
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);
//字符的比較根據(jù)字符所對應(yīng)ASCII值來比較大小
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);
}
對于String類的比較可以參考我之前寫的博客:初識java的String類

2、類的比較
對于類的比較如果直接像元素比較一樣可能會(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指向的是不同對象
// System.out.println(c1<c2);編譯報(bào)錯(cuò)
System.out.println(c1==c3);//打印false,因?yàn)閏1和c2指向的是不同對象
}
}
從此編譯結(jié)果中我們可以發(fā)現(xiàn),java中引用類型的變量不能直接按照> 或者< 方式進(jìn)行比較,但確可以使用==符號進(jìn)行比較?
原因:對于用戶自己實(shí)現(xiàn)定義的類型,都是默認(rèn)為Object類,Object類提供了equal方法,
此方法的比較規(guī)則是:
無比較引用變量引用對象的內(nèi)容,而是直接比較引用變量的地址,因此equal方法一般在使用的時(shí)候會(huì)被重寫
// Object中equal的實(shí)現(xiàn),可以看到:直接比較的是兩個(gè)引用變量的地址
public boolean equals(Object obj) {
return (this == obj);
}
3、比較方法
在一些情況下,我們需要比較的是對象的內(nèi)容,而不是比較對象的地址是否相同,則需要重寫比較方法。
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方法實(shí)現(xiàn)如下:
如果這個(gè)類指向同一個(gè)對象則直接返回true;
如果傳入的為空或者其對象類型不是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 指向的對象小于 o 指向的對象
// == 0: 表示 this 指向的對象等于 o 指向的對象
// > 0: 表示 this 指向的對象等于 o 指向的對象
public int compareTo(T o);
}
對于用戶自定義類型,如果按照大小與方式進(jìn)行比較:可以在定義類的時(shí)候?qū)崿F(xiàn)接口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 比較大
}
}

3.3 基于比較器比較基于比較器比較:Comparator接口
按照比較器方式進(jìn)行比較,具體步驟如下:
- 戶自定義比較器類,實(shí)現(xiàn)
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();
// 使用比較器對象進(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 三種比較方式的對比

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

