最近一直有事誉简,博客也停筆了一段時(shí)間,十分抱歉回梧。
這一篇主要講講對(duì)象的比較废岂,什么是對(duì)象的比較,我們知道兩個(gè)數(shù)值類型只需要用“==”符號(hào)即可進(jìn)行相等判斷狱意,但如果是兩個(gè)Goods對(duì)象呢湖苞?如何進(jìn)行比較?這時(shí)候详囤,我們的equals方法就派上用場(chǎng)了财骨。equals方法是類的祖先Object類的另一個(gè)protected方法,既然是protected方法(能被同一個(gè)包里的所有類所訪問, 能被該類的子類所訪問藏姐,子類可以和父類不在一個(gè)包中)隆箩,子類是可以直接訪問的,但如果沒有覆蓋該方法羔杨,那么使用的只是Object的原始比較方法捌臊,return(this==obj) ,僅僅比較兩個(gè)對(duì)象的地址是否一致兜材。
對(duì)于String類型理澎,已經(jīng)設(shè)計(jì)好了equals方法,所以我們只需要拿來用就可以了曙寡,如果是我們自定義的類糠爬,那就得重寫該方法來進(jìn)行覆蓋,下面還是用Goods類來舉一個(gè)小栗子:
public class Goods {
private String title;
private double price;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
//構(gòu)造器
public Goods(String title, double price) {
this.title = title;
this.price = price;
}
}
這是簡(jiǎn)化版的Goods類举庶,有兩個(gè)私有成員變量以及它們的設(shè)置器秩铆,訪問器,還有一個(gè)構(gòu)造器灯变,下面我們來重寫父類的equals方法殴玛,判斷兩個(gè)Goods是否相等,邏輯上添祸,我們只需要兩者標(biāo)題和價(jià)格一致即可認(rèn)為兩個(gè)商品是相等的(當(dāng)然可以根據(jù)實(shí)際情況進(jìn)行調(diào)整)滚粟,下面我們來設(shè)計(jì)一下equals方法:
/**
* @author Frank
* @create 2017/11/20
* @description 被測(cè)試類,測(cè)試equals方法
*/
public class Goods {
private String title;
private double price;
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
//構(gòu)造器
public Goods(String title, double price) {
this.title = title;
this.price = price;
}
//覆蓋equals方法
@Override
public boolean equals(Object obj) {
Goods tmp = (Goods) obj;
if (price == tmp.getPrice() && title.equals(tmp.getTitle())){
return true;
}else {
return false;
}
}
}
這里我們覆蓋了父類的equals方法刃泌,在equals方法中將obj強(qiáng)制類型轉(zhuǎn)換為Goods類凡壤,再比較兩者價(jià)格和標(biāo)題是否相等署尤,只要都相等,則返回true亚侠,否則返回false曹体,這也符合我們的需求,下面測(cè)試一下:
/**
* @author Frank
* @create 2017/11/20
* @description 測(cè)試類硝烂,用于測(cè)試equals方法
*/
public class Test {
public static void main(String[] args) {
Goods a = new Goods("Java",100);
Goods b = new Goods("C++",100);
Goods c = new Goods("Java",100);
System.out.println(a.equals(b));
System.out.println(a.equals(c));
}
}
輸出結(jié)果為:false ture
這樣我們就簡(jiǎn)單的實(shí)現(xiàn)了equals方法箕别,但是,這個(gè)equals方法并不完美滞谢,首先串稀,由于我們傳入的是Object對(duì)象,所以并不知道它原本的類型是否為Goods類型狮杨,如果不是Goods類型母截,當(dāng)然不能拿來比較,于是我們得先進(jìn)行一下類型判斷:
@Override
public boolean equals(Object obj) {//類型判斷
if (obj.getClass() != this.getClass()){
return false;
}else {
Goods tmp = (Goods) obj;
if (price == tmp.getPrice() && title.equals(tmp.getTitle())){
return true;
}else {
return false;
}
}
}
仍舊不完美橄教,如果比較的對(duì)象就是自身或者兩者指向同一個(gè)對(duì)象的話清寇,直接返回true即可:
@Override
public boolean equals(Object obj) {
//先檢測(cè)是否為自比較
if ( this == obj || obj == null){
return true;
}
//類型判斷
if (obj.getClass() != this.getClass()){
return false;
}else {
Goods tmp = (Goods) obj;
if (price == tmp.getPrice() && title.equals(tmp.getTitle())){
return true;
}else {
return false;
}
}
}
現(xiàn)在就好很多了,那么此時(shí)我們調(diào)用equals方法跟使用”==“比較符號(hào)有什么區(qū)別呢护蝶,來看一個(gè)栗子:
public class Test {
public static void main(String[] args) {
Goods a = new Goods("Java",100);
Goods b = new Goods("C++",100);
Goods c = new Goods("Java",100);
Goods d = a;
System.out.println(a.equals(b));
System.out.println(a.equals(c));
System.out.println(a.equals(d));
System.out.println(a==b);
System.out.println(a==c);
System.out.println(a==d);
}
}
輸出如下:
false
true
true
false
false
true
對(duì)于前三個(gè)輸出應(yīng)該沒什么問題华烟,主要看后三個(gè),這里用相等比較符時(shí)滓走,判斷的僅僅是兩個(gè)變量存儲(chǔ)的內(nèi)容是否一致,由于a帽馋、b搅方、c、d均為引用類型绽族,所以比較的僅僅是它們是否指向相同的對(duì)象姨涡,這里只有a跟d指向的是相同的對(duì)象,c雖然title和price都與a相同吧慢,但是跟a是兩個(gè)完全不同的對(duì)象涛漂,因此沒有返回的是false。
另外检诗,有人也許會(huì)問匈仗,做類型判斷的時(shí)候,為什么不用instanceof或者isInstance方法逢慌,這里簡(jiǎn)單說明一下原因悠轩。instance判斷的是a對(duì)象是否和b對(duì)象屬于同一個(gè)類,或者有同一個(gè)父類攻泼,或者實(shí)現(xiàn)了同一個(gè)接口火架。isinstance方法則判斷兩種類型是否可以進(jìn)行強(qiáng)轉(zhuǎn)鉴象。
由于這個(gè)小栗子并沒有相關(guān)上下文,所以還是直接用getClass方法進(jìn)行判斷比較穩(wěn)妥何鸡,當(dāng)然纺弊,以后可以根據(jù)具體實(shí)際情況進(jìn)行修改。
至此骡男,equals方法講解完畢淆游,很簡(jiǎn)單吧。之后還是會(huì)繼續(xù)更新的洞翩,歡迎大家繼續(xù)關(guān)注稽犁!
真正重要的東西,用眼睛是看不見的骚亿。