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)搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://blog.csdn.net/weixin_49830664/article/details/120817550