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

資訊專欄INFORMATION COLUMN

Java Object對(duì)象的hashcode和equals方法

chnmagnus / 3423人閱讀

摘要:在中對(duì)象是一切對(duì)象都會(huì)自動(dòng)繼承的一個(gè)類,在這個(gè)類中定義的屬性和方法可以說是每個(gè)類都必須的。這里有必要說說這里對(duì)象里面的幾個(gè)方法返回該對(duì)象的哈希碼值。這些基于表的集合,只能要求被存放的對(duì)象實(shí)現(xiàn)自己的方法,保證的均勻性。

Object

在Java中Object對(duì)象是一切對(duì)象都會(huì)自動(dòng)繼承的一個(gè)類,在這個(gè)類中定義的屬性和方法可以說是每個(gè)類都必須的。

這里有必要說說這里對(duì)象里面的幾個(gè)方法

hashCode()

返回該對(duì)象的哈希碼值。

為什么需要這個(gè)方法

我在面試時(shí),問一些基本的Java知識(shí)時(shí),很多時(shí)候會(huì)問到這個(gè)問題。但大多數(shù)人,沒有很明白的說明這個(gè)問題。

首先這個(gè)問題,還是先要說下hash表的數(shù)據(jù)結(jié)構(gòu),如果還想復(fù)習(xí)下關(guān)于hash表結(jié)構(gòu)的知識(shí),可以參看這篇文章,寫的不錯(cuò):http://www.cnblogs.com/dolphin0520/archive/2012/09/28/2700000.html

這個(gè)方法的存在主要是配合一些基于hash表的數(shù)據(jù)結(jié)構(gòu)的集合,像HashMap。在這些基于hash結(jié)構(gòu)的數(shù)據(jù)集合中,存放的對(duì)象要有自己的hashCode方法,除了String類型。以HashMap為例:

    /**
     * Retrieve object hash code and applies a supplemental hash function to the
     * result hash, which defends against poor quality hash functions.  This is
     * critical because HashMap uses power-of-two length hash tables, that
     * otherwise encounter collisions for hashCodes that do not differ
     * in lower bits. Note: Null keys always map to hash 0, thus index 0.
     */
    final int hash(Object k) {
        int h = hashSeed;
        if (0 != h && k instanceof String) {
            return sun.misc.Hashing.stringHash32((String) k);
        }
        h ^= k.hashCode();
        // This function ensures that hashCodes that differ only by
        // constant multiples at each bit position have a bounded
        // number of collisions (approximately 8 at default load factor).
        h ^= (h >>> 20) ^ (h >>> 12);
        return h ^ (h >>> 7) ^ (h >>> 4);
    }

HashMap在存放或者檢索數(shù)據(jù)時(shí),都會(huì)先去計(jì)算的key的hash值。這些基于hash表的集合,只能要求被存放的對(duì)象實(shí)現(xiàn)自己的hash方法,保證hash的均勻性。在jdk中,為了保證一個(gè)通用的計(jì)算hash的方法,jvm采用將對(duì)象的內(nèi)部地址轉(zhuǎn)換成一個(gè)整數(shù)來實(shí)現(xiàn)
我們也可以根據(jù)自己的邏輯修改hashcode方法

equals(Object o)

用于測(cè)試某個(gè)對(duì)象是否同另一個(gè)對(duì)象相等

在Java語言中要比較兩個(gè)對(duì)象是否相等,有時(shí)只用"=="是不行的,還有這個(gè)equals方法。比如在Java中比較兩個(gè)字符串相等,那就必須使用equals方法
因?yàn)椋?b>==計(jì)算表達(dá)式在判斷引用對(duì)象時(shí),只是去判斷內(nèi)存地址引用是否一樣,而equals方法才會(huì)去判斷內(nèi)存的值是否一樣或是按照自實(shí)行邏輯去判斷。

必要時(shí)重寫equals

equals方法在很多地方會(huì)調(diào)用,包括我們直接調(diào)用equals方法,還有判斷集合對(duì)象是否相等時(shí)的間接調(diào)用。在這種間接調(diào)用時(shí),我們一般都會(huì)去重寫它的equals方法。
比如,有個(gè)User對(duì)象,我們認(rèn)為User的id相等就是同一個(gè)對(duì)象

  Public class User{
      public long id;
      public String name;
  }

現(xiàn)在有個(gè)兩個(gè)存放User對(duì)象的集合userListA、usersListB,這時(shí)我們判斷這倆集合是否相等,其目的就是判斷這倆集合存放的對(duì)象是否相等(只簡(jiǎn)單要求List各個(gè)索引位置的User對(duì)象相等)。
那這是我們就必須重寫User對(duì)象的equals方法

   @Override
   public boolean equals(Object o) {
       if (this == o) return true;
       if (o == null || getClass() != o.getClass()) return false;
       User user = (User) o;
       return id == user.id;
   }

重寫equals方法的要求:

自反性:對(duì)于任何非空引用x,x.equals(x)應(yīng)該返回true。

對(duì)稱性:對(duì)于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也應(yīng)該返回true。

傳遞性:對(duì)于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也應(yīng)該返回true。

一致性:如果x和y引用的對(duì)象沒有發(fā)生變化,那么反復(fù)調(diào)用x.equals(y)應(yīng)該返回同樣的結(jié)果。

非空性:對(duì)于任意非空引用x,x.equals(null)應(yīng)該返回false。

重寫了equals方法要不要重寫hashCode方法

當(dāng)我們重寫hashcode方法時(shí),都會(huì)有一套模板,我們使用到的編輯器一般都會(huì)支持基于模板自動(dòng)生成。如果留心,你會(huì)發(fā)現(xiàn)當(dāng)你使用這個(gè)功能時(shí)重寫equals方法會(huì)自動(dòng)也把hashcode方法重寫。

在Java規(guī)范中,要求:

如果a.equals(b),那么a和b的hashcode方法一定要相等,但a和b不相等時(shí),hashcode方法可以相等也可以不相等。所以當(dāng)我們重寫了它的equals方法后,最好遵從這份規(guī)范,修改它的hashcode方法。

equals 方法未來會(huì)不會(huì)舍棄

如果==這種計(jì)算,不僅僅是看內(nèi)存地址是否相等,如果在不相等時(shí)也去判斷下不同內(nèi)存地址下的值也是相等,就返回true,那有一天Object對(duì)象會(huì)不會(huì)就會(huì)舍棄這個(gè)equals方法

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/64720.html

相關(guān)文章

  • Java Object方法分析

    摘要:類方法分析聲明文章均為本人技術(shù)筆記,轉(zhuǎn)載請(qǐng)注明出處類簡(jiǎn)介類是所有類的父類,在中只有基本數(shù)據(jù)類型不是對(duì)象。對(duì)于所有數(shù)組類型對(duì)象類型基本數(shù)據(jù)類型數(shù)組都繼承于類方法類中通過判斷兩個(gè)對(duì)象是否具有相同引用,從而判斷兩個(gè)對(duì)象是否相同子類只要重寫方法,就 Java Object類方法分析 聲明 文章均為本人技術(shù)筆記,轉(zhuǎn)載請(qǐng)注明出處https://segmentfault.com/u/yzwall ...

    zhisheng 評(píng)論0 收藏0
  • 【碼藝雜談】Java相同與不同

    摘要:如果根據(jù)方法得到兩個(gè)對(duì)象不相同,那么兩個(gè)對(duì)象的方法的結(jié)果不一定不相同,我們可以利用這一點(diǎn)來提高散列表的性能。最后回到文章開頭的問題,如何判斷兩個(gè)對(duì)象或值是否相同這個(gè)問題其實(shí)有兩方面的含義,一方面是判斷的方法,另一方面是判斷的效率。 Java中有很多場(chǎng)景需要判斷兩個(gè)對(duì)象或者兩個(gè)值,那么 判斷是否相同的依據(jù)是什么? 如何判斷是否相同呢? 為了解釋這個(gè)問題,我們從Java語言的根說起,那...

    xingqiba 評(píng)論0 收藏0
  • 好用java.util.Objects類

    摘要:好用的類在中,新增了一個(gè)工具類,就是類。事實(shí)上,我們進(jìn)行比較的對(duì)象,除了引用對(duì)象之外,就是自動(dòng)裝箱后等類型了。我們?cè)谥貙憰r(shí),可以參考上面的類的寫法。 好用的java.util.Objects類 在jdk1.7中,新增了一個(gè)工具類,就是java.util.Objects類。它有3個(gè)簡(jiǎn)單的封裝方法,對(duì)于平常的使用來說挺有用的,分別是:hashCode、equals、toString這3個(gè)方...

    heartFollower 評(píng)論0 收藏0
  • 談?wù)?em>java中幾種常見散列算法及解決哈希碰撞方式

    摘要:接下來分析幾個(gè)常見的實(shí)現(xiàn)方式。再哈希法再哈希法,就是出現(xiàn)沖突后采用其他的哈希函數(shù)計(jì)算,直到不再?zèng)_突為止。,其中為不同的哈希函數(shù)。 由表及里,循序漸進(jìn),請(qǐng)往下看。隨手點(diǎn)贊是對(duì)作者最大的鼓勵(lì)!^0^。 什么是哈希表 引用:嚴(yán)蔚敏 《數(shù)據(jù)結(jié)構(gòu)(C語言版)》中的內(nèi)容 showImg(https://segmentfault.com/img/bVZlmE?w=800&h=364); 哈希表就是 ...

    沈建明 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<