国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

幾分鐘理解 Jdk - ==,hashCode() 與 equals()

CNZPH / 1681人閱讀

摘要:小概與,這三個操作在程序當中滿地都是,特別是容器里,如中的哈希映射與搜索元素就是根據和判斷的,所以如何正確的理解和使用顯得非常重要,并且在封裝類的時候,十分建議通通重寫我們先要知道這個概念,每個線程都有屬于自己的虛擬機棧,虛擬機棧中的元素我

小概

==,hashCode() 與 equals() ,這三個操作在 Java 程序當中滿地都是,特別是容器里,如 Map 中的哈希映射與搜索元素就是根據
hashCode() 和 equals() 判斷的,所以如何正確的理解和使用顯得非常重要,并且在封裝類的時候,十分建議通通重寫

我們先要知道這個概念,每個線程都有屬于自己的 虛擬機棧,虛擬機棧中的元素我們稱之為 棧幀,每運行一個方法時,虛擬機會為這個方法創建一個棧幀,并入棧,方法結束后便出棧

那么我們操作的變量有兩種

局部變量:存在當前棧幀的局部變量表里,如果是基本數據類型便是值的大小,如果是對象便是一個指向堆內存中對象地址的引用

全部變量:存在方法區中,存儲規則一樣

所以我們比較的,是 基本數據類型的大小引用地址

a == b

比較規則

當a,b 為對象時,表示兩者 引用地址 是否相同,即堆內存中地址是否相同

當a,b 為基本數據類型時,表示兩者 數據大小 是否相等

a.equals(b)

假設 a 的對象類型為 A

比較規則

a,b 只能為對象,表示兩者 對象屬性 是否相等,如 String 就是比較內部維護的 char[] 數組每一個字符是否相等

為了簡化比較復雜度,往往會先判斷 a == b,如果它們都指向同一個地址,那么兩者內容肯定一樣,則不需要逐一比較對象內容中的值

我們可以認為,== 和 equals 的推導關系是 充分不必要

== 成立則 equals 成立

equals 成立,== 不一定成立

如何比較屬性

比如區分兩個學生是否是同一個學生,我們其實只需要查看他們的學號是否相同就行了

也就是我們應該比較能唯一標識這個對象的一個甚至多個對象屬性,情況完全視不同對象而定

如果 A 未重寫 equals()

如果 A 未重寫時,調用的是父類的 equals(),還未重寫,會檢查到 Object,而 Object 是如下比較的

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

利用 == 號比較對象內容是否相等未必有點草率,因此我們對這個方法應當十分謹慎

如何重寫

重寫時需注意應當滿足如下規則,摘自 《Effective Java》

自反性:x.equals(x)必須返回true

對稱性:x.equals(y)與y.equals(x)的返回值必須相等

傳遞性:x.equals(y)為true,y.equals(z)也為true,那么x.equals(z)必須為true

一致性:如果對象x和y在equals()中使用的信息都沒有改變,那么x.equals(y)值始終不變

非null:x不是null,y為null,則x.equals(y)必須為false

在這里建議按以下規則重寫

建議判斷 a == b,省去沒必要的比較

建議先判斷 b instanceOf A,再做能能標識唯一對象的一個或多個屬性的比較

建議考慮 super.equals(b)

a.hashCode()

該方法返回的是對象的哈希值,主要應用于哈希容器映射時,將所有類型對象映射成整數

如何重寫

在這里建議按以下規則重寫

建議對能標識唯一對象的一個或多個屬性進行 hashCode() 重寫

建議利用 jdk 基礎封裝類的 hashCode()

建議考慮 super.equals(b)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/67541.html

相關文章

  • 不同時重寫equalshashCode又怎樣

    閱讀原文:不同時重寫equals和hashCode又怎樣! 可能一問到equals和hashCode相關的問題,就會有人講他們的自反性,對稱性,一致性,傳遞性等幾條約定了,此時我不得不佩服,這么多約定竟然都能記得,但我不知道你是不是真的理解呢。 我不同時重寫又能如何呢? showImg(https://segmentfault.com/img/remote/1460000018795219); 我...

    nifhlheimr 評論0 收藏0
  • 關于equalshashCode方法的一些理解

    摘要:而這次在一的一方實體里重寫基類的和方法做去重,感覺用的代碼量減少了,又能提高效率,所以我這里對這兩個方法做些自己的理解。不相等的兩個對象,不一定不相等。不相等,那么是一定不等的。文章若有錯誤之處,歡迎指出。 昨天寫hibernate一對多查詢的時候,用set集合來儲存值,我們都知道java中List集合是有序,可重復的,Set集合是無序,不可重復的。所以當時寫這個查詢的時候果斷用Set...

    ctriptech 評論0 收藏0
  • Object對象你真理解了嗎?

    摘要:無論在中出現什么,都可以認為它是對象除了八大基本數據類型。讓當前線程等待某個對象的鎖,當然應該通過這個對象來操作了。但是要注意的是方法調用后,被喚醒的線程不會立馬獲得到鎖對象。主要的區別在于在釋放同時,釋放了對象鎖的控制。 前言 五一回家又斷更了一個放假時間了~~~ 只有光頭才能變強 回顧前面: ThreadLocal就是這么簡單 多線程三分鐘就可以入個門了! 多線程基礎必要知識點!...

    anquan 評論0 收藏0
  • Java編程中那些再熟悉不過的知識點(持續更新)

    摘要:語言通過字節碼的方式,在一定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特點。有針對不同系統的特定實現,,,目的是使用相同的字節碼,它們都會給出相同的結果。項目主要基于捐贈的源代碼。 本文來自于我的慕課網手記:Java編程中那些再熟悉不過的知識點,轉載請保留鏈接 ;) 1. 面向對象和面向過程的區別 面向過程 優點: 性能比面向對象高。因為類調用時需要實例...

    taowen 評論0 收藏0
  • 重新詳盡的理解HasMap

    摘要:根據的重新計算值。如果這兩個的通過比較返回,新添加的將覆蓋集合中原有的,但不會覆蓋。如果這兩個的通過比較返回,新添加的將與集合中原有形成鏈,而且新添加的位于鏈的頭部具體說明繼續看方法的說明。 關于hashCode hashCode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashCode是用來在散列存儲結構中確定對象的存儲地址的. 1.hashcode是用來...

    maxmin 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<