您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何理解java對象的比較”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何理解java對象的比較”吧!
1、元素的比較
2、類的比較
3、比較方法
3.1 重寫equals方法
3.2 基于Comparble接口類的比較
3.3 基于比較器比較基于比較器比較:Comparator接口
3.4 三種比較方式的對比
在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
類的比較可以參考我之前寫的博客:初識java
的String
類
對于類的比較如果直接像元素比較一樣可能會造成編譯錯誤或者與預期效果的不一樣。
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); }
在一些情況下,我們需要比較的是對象的內容,而不是比較對象的地址是否相同,則需要重寫比較方法。
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
的比較
Comparble
是JDK
提供的泛型的比較接口類,源碼實現具體如下:
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 比較大 } }
按照比較器方式進行比較,具體步驟如下:
戶自定義比較器類,實現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對象的比較”的內容了,經過本文的學習后,相信大家對如何理解java對象的比較這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。