淺談java對(duì)象的比較
1、元素的比較
在java中,基本類(lèi)型的對(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類(lèi)的比較可以參考我之前寫(xiě)的博客:初識(shí)java的String類(lèi)

2、類(lèi)的比較
對(duì)于類(lèi)的比較如果直接像元素比較一樣可能會(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中引用類(lèi)型的變量不能直接按照> 或者< 方式進(jìn)行比較,但確可以使用==符號(hào)進(jìn)行比較?
原因:對(duì)于用戶自己實(shí)現(xiàn)定義的類(lèi)型,都是默認(rèn)為Object類(lèi),Object類(lèi)提供了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的子類(lèi)
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è)類(lèi)指向同一個(gè)對(duì)象則直接返回true;
如果傳入的為空或者其對(duì)象類(lèi)型不是Card,則返回false
按照類(lèi)的實(shí)現(xiàn)目標(biāo)完成比較,這里只要花色和數(shù)值一樣,就認(rèn)為是相同的牌
注意下調(diào)用其他引用類(lèi)型的比較也需要 equals,例如這里的 suit 的比較
3.2 基于Comparble接口類(lèi)的比較
Comparble是JDK提供的泛型的比較接口類(lèi),源碼實(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ì)于用戶自定義類(lèi)型,如果按照大小與方式進(jìn)行比較:可以在定義類(lèi)的時(shí)候?qū)崿F(xiàn)接口Comparable,并在類(lèi)中重寫(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)行比較,具體步驟如下:
- 戶自定義比較器類(lèi),實(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)文章
java判斷各類(lèi)型字符個(gè)數(shù)實(shí)例代碼
大家好,本篇文章主要講的是java判斷各類(lèi)型字符個(gè)數(shù)實(shí)例代碼,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下,方便下次瀏覽2021-12-12
Java8 用Lambda表達(dá)式給List集合排序的實(shí)現(xiàn)
這篇文章主要介紹了Java8 用Lambda表達(dá)式給List集合排序的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08
Java 數(shù)據(jù)庫(kù)連接池 DBCP 的介紹
這篇文章主要給大家分享的是 Java 數(shù)據(jù)庫(kù)連接池 DBCP 的介紹, 是 Apache 旗下 Commons 項(xiàng)目下的一個(gè)子項(xiàng)目,提供連接池功能DBCP,下面來(lái)看看文章的具體介紹內(nèi)容吧,需要的朋友可以參考一下2021-11-11
在Java中實(shí)現(xiàn)線程安全的單例模式的常見(jiàn)方式
單例模式是一種常用的軟件設(shè)計(jì)模式,它確保一個(gè)類(lèi)只有一個(gè)實(shí)例,并提供一個(gè)全局訪問(wèn)點(diǎn),在多線程環(huán)境下,確保單例模式的線程安全性是非常重要的,因?yàn)槎鄠€(gè)線程可能會(huì)同時(shí)嘗試創(chuàng)建實(shí)例,導(dǎo)致實(shí)例不唯一的問(wèn)題,本文介紹了在Java中實(shí)現(xiàn)線程安全的單例模式有幾種常見(jiàn)的方式2024-09-09
Springboot創(chuàng)建項(xiàng)目的圖文教程(idea版本)
這篇文章主要介紹了Springboot創(chuàng)建項(xiàng)目的圖文教程(idea版本),本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
一個(gè)簡(jiǎn)單的Java文件讀取的進(jìn)度條
這篇文章主要介紹了一個(gè)簡(jiǎn)單的Java文件讀取的進(jìn)度條,寫(xiě)一個(gè)可以使用的?demo,涉及到了文件的相對(duì)路徑問(wèn)題,需要的朋友可以參考下2023-04-04
java?Date和SimpleDateFormat時(shí)間類(lèi)詳解
這篇文章主要介紹了java?Date和SimpleDateFormat時(shí)間類(lèi)詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-08-08
Java如何使用遞歸查詢(xún)多級(jí)樹(shù)形結(jié)構(gòu)數(shù)據(jù)(多級(jí)菜單)
這篇文章主要介紹了Java如何使用遞歸查詢(xún)多級(jí)樹(shù)形結(jié)構(gòu)數(shù)據(jù)(多級(jí)菜單),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07

