一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 重寫Java中的equals方法介紹

重寫Java中的equals方法介紹

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

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

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

Object中equals方法

Object中的equals方法用于檢測一個對象是否等于另外一個對象. Object類中,判斷兩個對象是否引用同一個對象實現equals方法,源碼如下:

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

   實際處理中,若要比較兩個對象是否相等,一般需要重寫equals方法.

例1:雇員對象比較

如果兩個雇員對象的姓名, 薪水和雇傭一樣,就認為它們相等.重寫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) {
        // 如果為同一對象的不同引用,則相同    if (this == obj) {      return true;    }    // 如果傳入的對象為空,則返回false    if (obj == null) {      return false;    }    // 如果兩者屬于不同的類型,不能相等    if (getClass() != obj.getClass()) {      return false;    }    // 類型相同, 比較內容是否相同    Employee other = (Employee) obj;    return Objects.equals(name, other.name) && salary == other.salary && Objects.equals(hireDay, other.hireDay);  }}

注意,比較通過Objects中靜態函數equals比較兩個對象是否相等.該方法源碼如下:

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

這樣,當兩個對象都為null時,返回true,例如,兩個Employee對象的name都為null, 返回true; 如果第一個對象不為null,則調用a.equals(Object obj)方法

對象比較與繼承

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

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

 這樣做不但沒有解決繼承子類的錯誤,還可能引發其他的一些錯誤,例1中,采用強制類型轉換的方式.

要實現子類對象比較,先了解一下java規范中對equals方法的約束.

java規范中equals方法特征

自反性

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

對稱性

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

傳遞性

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

一致性

若x和y引用的對象沒有發生改變, 則反復調用x.equals(y)應該返回同樣的結果.

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

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

如果子類能夠擁有自己的相等概念, 則對稱性需求強制采用getClass進行檢測

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

 注釋:

在標準的java庫中包含150多個equals方法的實現,包括instanceof檢測, 調用getClass檢測, 捕獲ClassCastException檢測或者什么都不做. 在java.sql.TimeStamp實現人員指出, Timestamp類繼承Date類,而后者的equals方法使用了一個instanceof檢測,這樣重寫equals方法時,就無法同時做到對稱性.

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

編寫equals方法的建議:

顯示參數命名為otherObject, 稍后轉化成other變量

?
1
public boolean equals(Object otherObject)

檢測this和otherObject是否是同一個對象的引用,是,返回true;

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

檢測otherObject是否為null, 是, 返回false;

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

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

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

如果所以子類語義相同,使用instanceof檢測:

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

將otherObject轉化為相對應的類型變量other

?
1
Employee other = (Employee)otherObject;

對所需要的比較的數據域進行比較. 如果是基本數據類型,使用a==b比較; 如果是對象比較,調用Objects.equals(a, b)進行比較

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

整個流程可以參照例1;

常見equals方法實現錯誤

?
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);
    }

總結

以上就是本文關于重寫Java中的equals方法介紹的全部內容,希望對大家有所幫助。有什么問題可以隨時留言,小編會及時回復大家的。感謝朋友們對本站的支持!

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日韩在线天堂免费观看 | 99rv精品视频在线播放 | 人人爽人人香蕉 | 11 13加污女qq看他下面 | 爱草视频 | 99这里只有精品在线 | 欧美一区精品二区三区 | 美女被视频网站 | 日本一区免费观看 | 亚洲精品一二三四区 | 福利一区二区在线观看 | 国产成人久久久精品一区二区三区 | 亚洲男女在线 | 26uuu久久| 久久全国免费久久青青小草 | 美女扒开屁股让男人进去 | 美琪美腿白丝交小说 | 国产成人精品免费午夜 | 亚洲国产AV无码综合在线 | h版小说| 成人免费一区二区三区在线观看 | 亚洲福利二区 | 污污的动态图合集 | 麻豆网站在线免费观看 | 久久电影精品久久99久久 | 99久久免费国产香蕉麻豆 | 欧美日韩在线一区 | 国产麻豆成91| 国内精品久久久久影院嫩草 | 成人人免费夜夜视频观看 | 精品国产欧美一区二区五十路 | 欧美怡红院视频一区二区三区 | 桃色导航 | 久久永久影院免费 | 亚洲AV无码乱码在线观看浪潮 | 免费视频精品一区二区三区 | h动态图男女啪啪27报 | 操操久久| 504神宫寺奈绪大战黑人 | 日本人与黑人做爰视频网站 | 丰满的闺蜜2中文字幕 |