摘要:在中對象是一切對象都會自動繼承的一個類,在這個類中定義的屬性和方法可以說是每個類都必須的。這里有必要說說這里對象里面的幾個方法返回該對象的哈希碼值。這些基于表的集合,只能要求被存放的對象實現自己的方法,保證的均勻性。
Object
在Java中Object對象是一切對象都會自動繼承的一個類,在這個類中定義的屬性和方法可以說是每個類都必須的。
這里有必要說說這里對象里面的幾個方法
hashCode()返回該對象的哈希碼值。
為什么需要這個方法我在面試時,問一些基本的Java知識時,很多時候會問到這個問題。但大多數人,沒有很明白的說明這個問題。
首先這個問題,還是先要說下hash表的數據結構,如果還想復習下關于hash表結構的知識,可以參看這篇文章,寫的不錯:http://www.cnblogs.com/dolphin0520/archive/2012/09/28/2700000.html
這個方法的存在主要是配合一些基于hash表的數據結構的集合,像HashMap。在這些基于hash結構的數據集合中,存放的對象要有自己的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在存放或者檢索數據時,都會先去計算的key的hash值。這些基于hash表的集合,只能要求被存放的對象實現自己的hash方法,保證hash的均勻性。在jdk中,為了保證一個通用的計算hash的方法,jvm采用將對象的內部地址轉換成一個整數來實現
我們也可以根據自己的邏輯修改hashcode方法
用于測試某個對象是否同另一個對象相等
在Java語言中要比較兩個對象是否相等,有時只用"=="是不行的,還有這個equals方法。比如在Java中比較兩個字符串相等,那就必須使用equals方法
因為,==計算表達式在判斷引用對象時,只是去判斷內存地址引用是否一樣,而equals方法才會去判斷內存的值是否一樣或是按照自實行邏輯去判斷。
equals方法在很多地方會調用,包括我們直接調用equals方法,還有判斷集合對象是否相等時的間接調用。在這種間接調用時,我們一般都會去重寫它的equals方法。
比如,有個User對象,我們認為User的id相等就是同一個對象
Public class User{ public long id; public String name; }
現在有個兩個存放User對象的集合userListA、usersListB,這時我們判斷這倆集合是否相等,其目的就是判斷這倆集合存放的對象是否相等(只簡單要求List各個索引位置的User對象相等)。
那這是我們就必須重寫User對象的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方法的要求:
自反性:對于任何非空引用x,x.equals(x)應該返回true。
對稱性:對于任何引用x和y,如果x.equals(y)返回true,那么y.equals(x)也應該返回true。
傳遞性:對于任何引用x、y和z,如果x.equals(y)返回true,y.equals(z)返回true,那么x.equals(z)也應該返回true。
一致性:如果x和y引用的對象沒有發生變化,那么反復調用x.equals(y)應該返回同樣的結果。
非空性:對于任意非空引用x,x.equals(null)應該返回false。
重寫了equals方法要不要重寫hashCode方法當我們重寫hashcode方法時,都會有一套模板,我們使用到的編輯器一般都會支持基于模板自動生成。如果留心,你會發現當你使用這個功能時重寫equals方法會自動也把hashcode方法重寫。
在Java規范中,要求:
如果a.equals(b),那么a和b的hashcode方法一定要相等,但a和b不相等時,hashcode方法可以相等也可以不相等。所以當我們重寫了它的equals方法后,最好遵從這份規范,修改它的hashcode方法。
equals 方法未來會不會舍棄如果==這種計算,不僅僅是看內存地址是否相等,如果在不相等時也去判斷下不同內存地址下的值也是相等,就返回true,那有一天Object對象會不會就會舍棄這個equals方法
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/64720.html
摘要:類方法分析聲明文章均為本人技術筆記,轉載請注明出處類簡介類是所有類的父類,在中只有基本數據類型不是對象。對于所有數組類型對象類型基本數據類型數組都繼承于類方法類中通過判斷兩個對象是否具有相同引用,從而判斷兩個對象是否相同子類只要重寫方法,就 Java Object類方法分析 聲明 文章均為本人技術筆記,轉載請注明出處https://segmentfault.com/u/yzwall ...
摘要:如果根據方法得到兩個對象不相同,那么兩個對象的方法的結果不一定不相同,我們可以利用這一點來提高散列表的性能。最后回到文章開頭的問題,如何判斷兩個對象或值是否相同這個問題其實有兩方面的含義,一方面是判斷的方法,另一方面是判斷的效率。 Java中有很多場景需要判斷兩個對象或者兩個值,那么 判斷是否相同的依據是什么? 如何判斷是否相同呢? 為了解釋這個問題,我們從Java語言的根說起,那...
摘要:好用的類在中,新增了一個工具類,就是類。事實上,我們進行比較的對象,除了引用對象之外,就是自動裝箱后等類型了。我們在重寫時,可以參考上面的類的寫法。 好用的java.util.Objects類 在jdk1.7中,新增了一個工具類,就是java.util.Objects類。它有3個簡單的封裝方法,對于平常的使用來說挺有用的,分別是:hashCode、equals、toString這3個方...
摘要:接下來分析幾個常見的實現方式。再哈希法再哈希法,就是出現沖突后采用其他的哈希函數計算,直到不再沖突為止。,其中為不同的哈希函數。 由表及里,循序漸進,請往下看。隨手點贊是對作者最大的鼓勵!^0^。 什么是哈希表 引用:嚴蔚敏 《數據結構(C語言版)》中的內容 showImg(https://segmentfault.com/img/bVZlmE?w=800&h=364); 哈希表就是 ...
閱讀 3596·2021-09-13 10:28
閱讀 1947·2021-08-10 09:43
閱讀 1020·2019-08-30 15:44
閱讀 3190·2019-08-30 13:14
閱讀 1846·2019-08-29 16:56
閱讀 2947·2019-08-29 16:35
閱讀 2853·2019-08-29 12:58
閱讀 872·2019-08-26 13:46