摘要:介紹的作用是獲取哈希碼,也稱為散列碼它實際上是返回一個整數(shù)。所以具有相索引的對象,在該散列碼位置處存在多個對象,我們必須依靠的和本身來進行區(qū)分。
1.hashCode介紹
hashCode() 的作用是獲取哈希碼,也稱為散列碼;它實際上是返回一個int整數(shù)。這個散列碼的作用是確定該對象在散列表中的索引位置,如果有看我的上一篇文章 什么是散列表,那么這里的散列碼就相當(dāng)于上文中根據(jù)首字母查詢散列表例子中 人名關(guān)鍵字k在散列表中的具體地址。hashCode() 定義在JDK的Object.java中,這就意味著Java中的任何類都包含有hashCode() 函數(shù)。
2.hashCode 的作用數(shù)組是java中效率最高的數(shù)據(jù)結(jié)構(gòu),但是“最高”是有前提的。第一我們需要知道所查詢數(shù)據(jù)的所在位置。第二:如果我們進行迭代查找時,數(shù)據(jù)量一定要小,對于大數(shù)據(jù)量而言一般推薦集合。
在 Java 集合中有兩類,一類是 List,一類是 Set 他們之間的區(qū)別就在于 List 集合中的元素師有序的,且可以重復(fù),而 Set 集合中元素是無序不可重復(fù)的。對于 List 好處理,但是對于 Set 而言我們要如何來保證元素不重復(fù)呢?通過迭代來 equals() 是否相等。數(shù)據(jù)量小還可以接受,當(dāng)我們的數(shù)據(jù)量大的時候效率可想而知(當(dāng)然我們可以利用算法進行優(yōu)化)。比如我們向 HashSet 插入 1000 數(shù)據(jù),難道我們真的要迭代 1000 次,調(diào)用 1000 次 equals() 方法嗎?hashCode 提供了解決方案。怎么實現(xiàn)?我們先看 hashCode 的源碼(Object)。
public native int hashCode();
它是一個本地方法,它的實現(xiàn)與本地機器有關(guān)。當(dāng)我們向一個集合中添加某個元素,集合會首先調(diào)用 hashCode 方法,這樣就可以直接定位它所存儲的位置,若該處沒有其他元素,則直接保存。若該處已經(jīng)有元素存在,就調(diào)用 equals 方法來匹配這兩個元素是否相同,相同則不存,不同則散列到其他位置。這樣處理,當(dāng)我們存入大量元素時就可以大大減少調(diào)用 equals() 方法的次數(shù),極大地提高了效率。
所以 hashCode 在上面扮演的角色為尋域(尋找某個對象在集合中區(qū)域位置)。hashCode 可以將集合分成若干個區(qū)域,每個對象都可以計算出他們的 散列碼,可以將 散列碼分組,每個分組對應(yīng)著某個存儲區(qū)域(散列表),根據(jù)一個對象的 散列碼就可以確定該對象所存儲區(qū)域,這樣就大大減少查詢匹配元素的數(shù)量,提高了查詢效率。
3.hashCode 對于一個對象的重要性hashCode 重要么?不重要,對于 List 集合、數(shù)組而言,但是對于 HashMap、HashSet、HashTable 而言,它變得異常重要。所以在使用 HashMap、HashSet、HashTable 時一定要注意 hashCode。對于一個對象而言,其 hashCode 過程就是一個簡單的 Hash 算法的實現(xiàn),其實現(xiàn)過程對你實現(xiàn)對象的存取過程起到非常重要的作用。
以 HashTable 為例闡述 hashCode 對于一個對象的重要性。
一個對象勢必會存在若干個屬性,如何選擇屬性來進行散列考驗著一個人的設(shè)計能力。如果我們將所有屬性進行散列,這必定會是一個糟糕的設(shè)計,因為對象的 hashCode 方法無時無刻不是在被調(diào)用,如果太多的屬性參與散列,那么需要的操作數(shù)時間將會大大增加,這將嚴(yán)重影響程序的性能。但是如果較少屬相參與散列,散列的多樣性會削弱,會產(chǎn)生大量的散列“沖突”,除了不能夠很好的利用空間外,在某種程度也會影響對象的查詢效率。其實這兩者是一個矛盾體,散列的多樣性會帶來性能的降低。
那么如何對對象的 hashCode 進行設(shè)計,本人 也沒有經(jīng)驗。從網(wǎng)上查到了這樣一種解決方案:設(shè)置一個緩存標(biāo)識來緩存當(dāng)前的散列碼,只有當(dāng)參與散列的對象改變時才會重新計算,否則調(diào)用緩存的 hashCode,這樣就可以從很大程度上提高性能。
在 HashTable 計算某個對象在 table[] 數(shù)組中的索引位置,其代碼如下:
int index = (hash & 0x7FFFFFFF) % tab.length;
為什么要 &0x7FFFFFFF?因為某些對象的 hashCode 可能會為負值,與 0x7FFFFFFF 進行與運算可以確保 index 為一個正數(shù)。通過這步我可以直接定位某個對象的位置,所以從理論上來說我們是完全可以利用 hashCode 直接定位對象的散列表中的位置,但是為什么會存在一個 key-value 的鍵值對,利用 key 的 hashCode 來存入數(shù)據(jù)而不是直接存放 value 呢?這就關(guān)系 HashTable 性能問題的最重要的問題: Hash 沖突!(詳見上篇)
我們知道沖突的產(chǎn)生是由于不同的對象產(chǎn)生了相同的散列碼, hashcode 返回的是 int,它的值只可能在 int 范圍內(nèi)。如果我們存放的數(shù)據(jù)超過了 int 的范圍呢?這樣就必定會產(chǎn)生兩個相同的 散列碼,這時在 散列碼 位置處會存儲兩個對象,我們就可以利用 key 本身來進行判斷。所以具有相索引的對象,在該 散列碼 位置處存在多個對象,我們必須依靠 key 的 hashCode 和key 本身來進行區(qū)分。而Key的比較就用到了equals
4.hashCode 與 equals簡而言之就是:
如果兩個對象相等,則hashcode一定也是相同的
兩個對象相等,對兩個對象分別調(diào)用equals方法都返回true
兩個對象有相同的hashcode值,它們也不一定是相等的
因此,equals 方法被覆蓋過,則 hashCode 方法也必須被覆蓋
hashCode() 的默認(rèn)行為是對堆上的對象產(chǎn)生獨特值。如果沒有重寫 hashCode(),則該 class 的兩個對象無論如何都不會相等(即使這兩個對象指向相同的數(shù)據(jù))
對象的比較過程如下:
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/74657.html
摘要:獲取的對象范圍方法獲取的是最終應(yīng)用在元素上的所有屬性對象即使沒有代碼,也會把默認(rèn)的祖宗八代都顯示出來而只能獲取元素屬性中的樣式。因此對于一個光禿禿的元素,方法返回對象中屬性值如果有就是據(jù)我測試不同環(huán)境結(jié)果可能有差異而就是。 花了很長時間整理的前端面試資源,喜歡請大家不要吝嗇star~ 別只收藏,點個贊,點個star再走哈~ 持續(xù)更新中……,可以關(guān)注下github 項目地址 https:...
摘要:我自己總結(jié)的學(xué)習(xí)的系統(tǒng)知識點以及面試問題,已經(jīng)開源,目前已經(jīng)。面試官那你都了解里面的哪些東西呢我哈哈哈這可是我的強項,從,說到,,又說到線程池,分別說了底層實現(xiàn)和項目中的應(yīng)用。 我自己總結(jié)的Java學(xué)習(xí)的系統(tǒng)知識點以及面試問題,已經(jīng)開源,目前已經(jīng) 35k+ Star。會一直完善下去,歡迎建議和指導(dǎo),同時也歡迎Star: https://github.com/Snailclimb... ...
摘要:閱讀原文技術(shù)面試中的軟技能作為求職者時,只聽別人說如何面試,按部就班的做,沒有特別的體會。如今作為面試官,面試別人時,才發(fā)現(xiàn)什么才是重要的事情。 閱讀原文:技術(shù)面試中的軟技能 作為求職者時,只聽別人說如何面試,按部就班的做,沒有特別的體會。如今作為面試官,面試別人時,才發(fā)現(xiàn)什么才是重要的事情。 形象 形象包括衣著發(fā)型和五官。衣著不必太正式(西裝),但也不能夠太隨意,比如肥胖的T恤和外套...
面試時7份靠能力,3份靠技能,而剛開始時的介紹項目又是技能中的重中之重,決定一次面試的成敗,那么面試時如果介紹自己的項目呢? 1、在面試前準(zhǔn)備項目描述 別害怕,因為面試官什么都不知道,面試官是人,不是神,拿到你的簡歷的時候,是沒法核實你的項目細節(jié)的。更何況,你做的項目是以月為單位算的,而面試官最多用30分鐘來從你的簡歷上了解你的項目經(jīng)驗,所以你對項目的熟悉程度要遠遠超過面試官,所以你一點也不用緊張...
閱讀 2374·2021-11-22 14:56
閱讀 1181·2019-08-30 15:55
閱讀 3213·2019-08-29 13:29
閱讀 1362·2019-08-26 13:56
閱讀 3503·2019-08-26 13:37
閱讀 567·2019-08-26 13:33
閱讀 3354·2019-08-26 13:33
閱讀 2235·2019-08-26 13:33