国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - 重寫Java中的equals方法介紹

重寫Java中的equals方法介紹

2021-01-30 12:04TinyWalker Java教程

這篇文章主要介紹了重寫Java中的equals方法介紹,具有一定參考價(jià)值,需要的朋友可以了解下。

Java中,只有8種基本類型不是對(duì)象,例如:4種整形類型(byte, short, int,long),2種浮點(diǎn)類型(flout, double),boolean, char不是對(duì)象,其他的所有類型,不論是對(duì)象數(shù)組,列表等都擴(kuò)展了Object類.了解學(xué)習(xí)Object中方法的設(shè)計(jì)原理和實(shí)現(xiàn)方式有助于更好的學(xué)習(xí)理解java語(yǔ)言.下面,我們首先學(xué)習(xí)一下Object中的equals方法. 判斷兩個(gè)對(duì)象相等時(shí),JVM首先查找兩個(gè)對(duì)象的hashCode, 如果兩者h(yuǎn)ashCode不同,則返回false;如果兩者的hashCode相同,則調(diào)用equals方法進(jìn)行比較.

Object中equals方法

Object中的equals方法用于檢測(cè)一個(gè)對(duì)象是否等于另外一個(gè)對(duì)象. Object類中,判斷兩個(gè)對(duì)象是否引用同一個(gè)對(duì)象實(shí)現(xiàn)equals方法,源碼如下:

?
1
2
3
public boolean equals(Object obj) {
  return (this == obj);
}

   實(shí)際處理中,若要比較兩個(gè)對(duì)象是否相等,一般需要重寫equals方法.

例1:雇員對(duì)象比較

如果兩個(gè)雇員對(duì)象的姓名, 薪水和雇傭一樣,就認(rèn)為它們相等.重寫equals方法如下:

?
1
2
3
4
5
6
public class Employee {
    private String name;
    private double salary;
    private Date hireDay;
    ...   @Override  public Boolean equals(Object obj) {
        // 如果為同一對(duì)象的不同引用,則相同    if (this == obj) {      return true;    }    // 如果傳入的對(duì)象為空,則返回false    if (obj == null) {      return false;    }    // 如果兩者屬于不同的類型,不能相等    if (getClass() != obj.getClass()) {      return false;    }    // 類型相同, 比較內(nèi)容是否相同    Employee other = (Employee) obj;    return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);  }}

注意,比較通過Objects中靜態(tài)函數(shù)equals比較兩個(gè)對(duì)象是否相等.該方法源碼如下:

?
1
2
3
public static boolean equals(Object a, Object b) {
   return (a == b) || (a != null && a.equals(b));
 }

這樣,當(dāng)兩個(gè)對(duì)象都為null時(shí),返回true,例如,兩個(gè)Employee對(duì)象的name都為null, 返回true; 如果第一個(gè)對(duì)象不為null,則調(diào)用a.equals(Object obj)方法

對(duì)象比較與繼承

   如果隱式和顯式的對(duì)象所屬類型不一致,equals方法該如何處理呢?在例1中,如果兩個(gè)對(duì)象的類型不一致,直接返回false;多數(shù)程序員直接使用instanceof檢測(cè):

?
1
if(!(obj instanceof Employee)) return false;

 這樣做不但沒有解決繼承子類的錯(cuò)誤,還可能引發(fā)其他的一些錯(cuò)誤,例1中,采用強(qiáng)制類型轉(zhuǎn)換的方式.

要實(shí)現(xiàn)子類對(duì)象比較,先了解一下java規(guī)范中對(duì)equals方法的約束.

java規(guī)范中equals方法特征

自反性

對(duì)于任何非空引用x, x.equals(x) 返回true;

對(duì)稱性

對(duì)于任何引用x, y, 當(dāng)且僅當(dāng)y.equals(x) 返回true, x.equals(y)返回true;

傳遞性

對(duì)于任何引用x, y, z, 若x.equals(y)返回true, y.equals(z)返回true; 則 x.equals(z)返回true;

一致性

若x和y引用的對(duì)象沒有發(fā)生改變, 則反復(fù)調(diào)用x.equals(y)應(yīng)該返回同樣的結(jié)果.

對(duì)任意非空引用x, x.equals(null) 返回false;

 下面可以通過兩個(gè)不同的情況看待這個(gè)問題:

如果子類能夠擁有自己的相等概念, 則對(duì)稱性需求強(qiáng)制采用getClass進(jìn)行檢測(cè)

如果由超類決定相等的概念, 那么就用instanceof進(jìn)行檢測(cè),這樣可以在不用子類的對(duì)象之間進(jìn)行相等的比較

 注釋:

在標(biāo)準(zhǔn)的java庫(kù)中包含150多個(gè)equals方法的實(shí)現(xiàn),包括instanceof檢測(cè), 調(diào)用getClass檢測(cè), 捕獲ClassCastException檢測(cè)或者什么都不做. 在java.sql.TimeStamp實(shí)現(xiàn)人員指出, Timestamp類繼承Date類,而后者的equals方法使用了一個(gè)instanceof檢測(cè),這樣重寫equals方法時(shí),就無法同時(shí)做到對(duì)稱性.

在由超類決定相等時(shí),可以考慮final關(guān)鍵字修改比較函數(shù),若考慮到子類equals方法靈活性,可以不加修飾,例如AbstractSet.equals方法,應(yīng)該申明為final, 這樣就可以比較子類HashSet和TreeSet, 但是考慮到子類的靈活性,沒有添加任何修飾.

編寫equals方法的建議:

顯示參數(shù)命名為otherObject, 稍后轉(zhuǎn)化成other變量

?
1
public boolean equals(Object otherObject)

檢測(cè)this和otherObject是否是同一個(gè)對(duì)象的引用,是,返回true;

?
1
2
3
if(this==otherObject){
  return true;
}

檢測(cè)otherObject是否為null, 是, 返回false;

?
1
2
3
if(otherObject == null){
  return false;
}

比較this和otherObject是否屬于同一個(gè)類. 如果equals的語(yǔ)義在每個(gè)子類中有所改變,就使用getClass檢測(cè):

?
1
2
3
if(getClass() != otherObject.getClass()){
  return false;
}

如果所以子類語(yǔ)義相同,使用instanceof檢測(cè):

?
1
2
3
if(!(otherObject instanceof Employee)){
  return false;
}

將otherObject轉(zhuǎn)化為相對(duì)應(yīng)的類型變量other

?
1
Employee other = (Employee)otherObject;

對(duì)所需要的比較的數(shù)據(jù)域進(jìn)行比較. 如果是基本數(shù)據(jù)類型,使用a==b比較; 如果是對(duì)象比較,調(diào)用Objects.equals(a, b)進(jìn)行比較

?
1
return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);

整個(gè)流程可以參照例1;

常見equals方法實(shí)現(xiàn)錯(cuò)誤

?
1
2
3
4
public class Employee {
    public Boolean equals(Employee other) {
        return Objects.equals(name, other.name) && salary ==other.salary && Objects.equals(hireDay, other.hireDay);
    }

總結(jié)

以上就是本文關(guān)于重寫Java中的equals方法介紹的全部?jī)?nèi)容,希望對(duì)大家有所幫助。有什么問題可以隨時(shí)留言,小編會(huì)及時(shí)回復(fù)大家的。感謝朋友們對(duì)本站的支持!

原文鏈接:http://www.cnblogs.com/TinyWalker/p/4834685.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲精品综合 | 亚洲日本va中文字幕 | 超碰国产在线 | 欧美日韩福利 | 亚洲一级淫片 | 国产人免费人成免费视频 | 午夜tv | 亚洲激情在线观看 | 亚洲四区| 久久久久9999国产精品 | 国产亚洲片 | 精品综合久久久 | 国产欧美综合一区二区三区 | 国产精品高潮呻吟久久 | 欧美高清一区 | 欧美国产精品一区二区三区 | 精品一区二区久久久久久久网站 | 国产一区色 | 转生成为史莱姆这档事第四季在线观看 | www.99精品| 天天操天操 | 国产成人精品一区二区三区视频 | 中文字幕精品一区二区三区精品 | 日本99精品 | 四虎影视4hu4虎成人 | 亚洲va国产va天堂va久久 | www国产网站 | 亚洲a人| 日韩午夜 | 国产一级黄片毛片 | 在线精品亚洲 | 日本三级一区二区 | 精品动漫一区 | 少妇一级片免费看 | 日韩超级大片免费看国产国产播放器 | 欧美日韩精品免费 | 久久精品国产清自在天天线 | 亚洲欧洲在线观看 | 女生高潮在线观看 | 久久国 | 欧美另类视频 |