最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

重寫Java中的equals方法介紹

 更新時間:2017年11月03日 10:12:20   作者:TinyWalker  
這篇文章主要介紹了重寫Java中的equals方法介紹,具有一定參考價值,需要的朋友可以了解下。

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

Object中equals方法

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

  public boolean equals(Object obj) {
    return (this == obj);
  }

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

例1:雇員對象比較

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

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;    }    // 類型相同, 比較內(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比較兩個對象是否相等.該方法源碼如下:

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

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

對象比較與繼承

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

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

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

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

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

自反性

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

對稱性

對于任何引用x, y, 當(dāng)且僅當(dāng)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引用的對象沒有發(fā)生改變, 則反復(fù)調(diào)用x.equals(y)應(yīng)該返回同樣的結(jié)果.

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

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

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

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

 注釋:

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

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

編寫equals方法的建議:

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

public boolean equals(Object otherObject)

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

if(this==otherObject){
  return true;
}

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

if(otherObject == null){
  return false;
}

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

if(getClass() != otherObject.getClass()){
  return false;
}

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

if(!(otherObject instanceof Employee)){
  return false;
}

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

Employee other = (Employee)otherObject;

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

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

整個流程可以參照例1;

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

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方法介紹的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站:淺談java中==以及equals方法的用法、java定時器timer的使用方法代碼示例等,有什么問題可以隨時留言,小編會及時回復(fù)大家的。感謝朋友們對本站的支持!

相關(guān)文章

  • java代碼塊之簡易qq登錄界面及按鈕顏色設(shè)置代碼

    java代碼塊之簡易qq登錄界面及按鈕顏色設(shè)置代碼

    這篇文章主要介紹了java代碼塊之簡易qq登錄界面及按鈕顏色設(shè)置代碼,具有一定參考價值,需要的朋友可以了解下。
    2017-11-11
  • Java深入了解數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊列(堆)

    Java深入了解數(shù)據(jù)結(jié)構(gòu)之優(yōu)先級隊列(堆)

    普通的隊列是一種先進(jìn)先出的數(shù)據(jù)結(jié)構(gòu),元素在隊列尾追加,而從隊列頭刪除。在優(yōu)先隊列中,元素被賦予優(yōu)先級。當(dāng)訪問元素時,具有最高優(yōu)先級的元素最先刪除。優(yōu)先隊列具有最高級先出 (first in, largest out)的行為特征。通常采用堆數(shù)據(jù)結(jié)構(gòu)來實(shí)現(xiàn)
    2022-01-01
  • 一文秒懂Java中的樂觀鎖 VS 悲觀鎖

    一文秒懂Java中的樂觀鎖 VS 悲觀鎖

    這篇文章主要介紹了java樂觀鎖 VS 悲觀鎖的相關(guān)知識,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-05-05
  • Java二叉樹中LCA問題解決方法兩則

    Java二叉樹中LCA問題解決方法兩則

    這篇文章主要介紹了Java二叉樹中LCA問題解決方法,總的來說這并不是一道難題,那為什么要拿出這道題介紹?拿出這道題真正想要傳達(dá)的是解題的思路,以及不斷優(yōu)化探尋最優(yōu)解的過程。希望通過這道題能給你帶來一種解題優(yōu)化的思路
    2022-12-12
  • Java線程阻塞工具LockSupport用法詳解

    Java線程阻塞工具LockSupport用法詳解

    Java中的LockSupport是一個用于線程同步的工具類,它提供了一種基于線程的阻塞和喚醒機(jī)制,LockSupport可以讓線程在特定條件下阻塞掛起,等待其他線程發(fā)送信號來喚醒它,本文將通過一個小案例給大家介紹一下LockSupport怎么用,讓你永遠(yuǎn)記住它
    2023-08-08
  • Java實(shí)現(xiàn)把文件壓縮成zip文件的示例代碼

    Java實(shí)現(xiàn)把文件壓縮成zip文件的示例代碼

    這篇文章主要為大家介紹了如何通過Java語言實(shí)現(xiàn)將文件壓縮成zip文件,本文中示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • IDEA 單元測試報錯:Class not found:xxxx springboot的解決

    IDEA 單元測試報錯:Class not found:xxxx springb

    這篇文章主要介紹了IDEA 單元測試報錯:Class not found:xxxx springboot的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Java?中如何創(chuàng)建按鈕單擊事件

    Java?中如何創(chuàng)建按鈕單擊事件

    我們使用事件偵聽器在Java中創(chuàng)建按鈕單擊事件,本文給大家講解Java中的按鈕單擊事件,結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05
  • MybatisPlus中QueryWrapper常用方法總結(jié)

    MybatisPlus中QueryWrapper常用方法總結(jié)

    MyBatis-Plus是一個Mybatis增強(qiáng)版工具,在MyBatis上擴(kuò)充了其他功能沒有改變其基本功能,為了簡化開發(fā)提交效率而存在,queryWrapper是mybatis plus中實(shí)現(xiàn)查詢的對象封裝操作類,本文就給大家總結(jié)了MybatisPlus中QueryWrapper的常用方法,需要的朋友可以參考下
    2023-07-07
  • Spring從入門到源碼之IOC基本用法

    Spring從入門到源碼之IOC基本用法

    這篇文章給大家介紹了Spring從入門到源碼之IOC基本用法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2022-01-01

最新評論

桂林市| 阜新| 邯郸市| 昌黎县| 北宁市| 宁德市| 柏乡县| 安宁市| 渝北区| 阳西县| 拉萨市| 嘉峪关市| 离岛区| 晋宁县| 浦东新区| 电白县| 浦县| 陵水| 米脂县| 全椒县| 昂仁县| 浦城县| 禄劝| 广宁县| 宁武县| 大连市| 蛟河市| 东乌| 巴林左旗| 甘洛县| 高雄县| 仁怀市| 玉溪市| 木兰县| 西乌珠穆沁旗| 灯塔市| 前郭尔| 昂仁县| 朔州市| 赤水市| 安陆市|