成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

CNZPH / 1709人閱讀

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

小概

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

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

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

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

全部變量:存在方法區(qū)中,存儲規(guī)則一樣

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

a == b

比較規(guī)則

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

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

a.equals(b)

假設(shè) a 的對象類型為 A

比較規(guī)則

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

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

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

== 成立則 equals 成立

equals 成立,== 不一定成立

如何比較屬性

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

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

如果 A 未重寫 equals()

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

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

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

如何重寫

重寫時需注意應當滿足如下規(guī)則,摘自 《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

在這里建議按以下規(guī)則重寫

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

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

建議考慮 super.equals(b)

a.hashCode()

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

如何重寫

在這里建議按以下規(guī)則重寫

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

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

建議考慮 super.equals(b)

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/67541.html

相關(guān)文章

  • 不同時重寫equalshashCode又怎樣

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

    nifhlheimr 評論0 收藏0
  • 關(guān)于equalshashCode方法的一些理解

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

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

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

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

    摘要:語言通過字節(jié)碼的方式,在一定程度上解決了傳統(tǒng)解釋型語言執(zhí)行效率低的問題,同時又保留了解釋型語言可移植的特點。有針對不同系統(tǒng)的特定實現(xiàn),,,目的是使用相同的字節(jié)碼,它們都會給出相同的結(jié)果。項目主要基于捐贈的源代碼。 本文來自于我的慕課網(wǎng)手記:Java編程中那些再熟悉不過的知識點,轉(zhuǎn)載請保留鏈接 ;) 1. 面向?qū)ο蠛兔嫦蜻^程的區(qū)別 面向過程 優(yōu)點: 性能比面向?qū)ο蟾?。因為類調(diào)用時需要實例...

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

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

    maxmin 評論0 收藏0

發(fā)表評論

0條評論

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