摘要:在中對(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方法
用于測(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í)行邏輯去判斷。
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
摘要:類方法分析聲明文章均為本人技術(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 ...
摘要:如果根據(jù)方法得到兩個(gè)對(duì)象不相同,那么兩個(gè)對(duì)象的方法的結(jié)果不一定不相同,我們可以利用這一點(diǎn)來提高散列表的性能。最后回到文章開頭的問題,如何判斷兩個(gè)對(duì)象或值是否相同這個(gè)問題其實(shí)有兩方面的含義,一方面是判斷的方法,另一方面是判斷的效率。 Java中有很多場(chǎng)景需要判斷兩個(gè)對(duì)象或者兩個(gè)值,那么 判斷是否相同的依據(jù)是什么? 如何判斷是否相同呢? 為了解釋這個(gè)問題,我們從Java語言的根說起,那...
摘要:好用的類在中,新增了一個(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è)方...
摘要:接下來分析幾個(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); 哈希表就是 ...
閱讀 3588·2021-09-13 10:28
閱讀 1937·2021-08-10 09:43
閱讀 1010·2019-08-30 15:44
閱讀 3178·2019-08-30 13:14
閱讀 1830·2019-08-29 16:56
閱讀 2938·2019-08-29 16:35
閱讀 2843·2019-08-29 12:58
閱讀 864·2019-08-26 13:46