淺談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ù)字符所對應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、類的比較
對于類的比較如果直接像元素比較一樣可能會造成編譯錯誤或者與預期效果的不一樣。
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指向的是不同對象
}
}
從此編譯結果中我們可以發(fā)現(xiàn),java中引用類型的變量不能直接按照> 或者< 方式進行比較,但確可以使用==符號進行比較?
原因:對于用戶自己實現(xiàn)定義的類型,都是默認為Object類,Object類提供了equal方法,
此方法的比較規(guī)則是:
無比較引用變量引用對象的內(nèi)容,而是直接比較引用變量的地址,因此equal方法一般在使用的時候會被重寫
// Object中equal的實現(xiàn),可以看到:直接比較的是兩個引用變量的地址
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方法實現(xiàn)如下:
如果這個類指向同一個對象則直接返回true;
如果傳入的為空或者其對象類型不是Card,則返回false
按照類的實現(xiàn)目標完成比較,這里只要花色和數(shù)值一樣,就認為是相同的牌
注意下調(diào)用其他引用類型的比較也需要 equals,例如這里的 suit 的比較
3.2 基于Comparble接口類的比較
Comparble是JDK提供的泛型的比較接口類,源碼實現(xiàn)具體如下:
public interface Comparable<E>{
// 返回值:
// < 0: 表示 this 指向的對象小于 o 指向的對象
// == 0: 表示 this 指向的對象等于 o 指向的對象
// > 0: 表示 this 指向的對象等于 o 指向的對象
public int compareTo(T o);
}
對于用戶自定義類型,如果按照大小與方式進行比較:可以在定義類的時候實現(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接口
按照比較器方式進行比較,具體步驟如下:
- 戶自定義比較器類,實現(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();
// 使用比較器對象進行比較
// == 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 三種比較方式的對比

到此這篇關于淺談java對象的比較的文章就介紹到這了,更多相關java對象的比較內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
詳談springboot過濾器和攔截器的實現(xiàn)及區(qū)別
今天小編就為大家分享一篇詳談springboot過濾器和攔截器的實現(xiàn)及區(qū)別,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-08-08
Springboot配置Swagger2登錄密碼的實現(xiàn)
本文主要介紹了Springboot配置Swagger2登錄密碼的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-03-03

