當前位置:首頁 » 操作系統 » hashcode源碼

hashcode源碼

發布時間: 2022-07-21 10:51:41

① HashMap源碼中put方法裡面e.hash == hash && ((k = e.key) == key || key.equals(k))

我認為這個是比較效率的問題,這樣寫可以盡量少的調用equals
如果把e.hash == hash去掉,只用equals比較,效率太低
(k = e.key) == key如果是true說明是同一個對象,就不用equals了,效率較高

java 的Object類的hashcode方法具體是怎麼實現的

hashcode其實是使用了散列函數的數據結構,具體的實現的話,需要參考源碼了

③ Java語言中Object對象的hashCode取值的底層演算法是怎樣實現的

在JDK中看到

public native int hashCode();

這是一個本地方法,需要找源代碼才能找到

然後我在Android SDK中的JDK Object類找到了這個,應該是你想要的了

publicinthashCode(){
intlockWord=shadow$_monitor_;
finalintlockWordStateMask=0xC0000000;//Top2bits.
finalintlockWordStateHash=0x80000000;//Top2bitsarevalue2(kStateHash).
finalintlockWordHashMask=0x0FFFFFFF;//Low28bits.
if((lockWord&lockWordStateMask)==lockWordStateHash){
returnlockWord&lockWordHashMask;
}
returnSystem.identityHashCode(this);
}

但最後的System.identityHashCode(this)方法還是一個本地方法,還得去找源碼,你折騰的話自己去搜索吧。

下面是String類的hashCode()方法,可以看下

publicinthashCode(){
inth=hash;
if(h==0&&value.length>0){
charval[]=value;

for(inti=0;i<value.length;i++){
h=31*h+val[i];
}
hash=h;
}
returnh;
}

④ JAVA中,String類中的hashCode()方法有什麼作用呢

hash從意義上來說應該是實現值的比較。
hashCode值與對象引用沒有必然聯系。在java中,值相同的兩個字元串不一定是同個對象。比如你上面的a和b就是兩個不同的對象。
字元串的hash值是根據字元串的值計算的,相同值的字元串對象hash值一定相同,具體的計算方法在jdk的文檔中有描述.
每個java對象都有一個唯一的標識,object類中的hash方法就是直接返回對象的這個內部id號,與string的hash方法是不同的,object的hash方法能夠用來區分不同的對象.因為原始的object對象沒有任何有意義的值可用來計算哈希

⑤ java中hashcode到底有什麼用,用於什麼情況,怎麼用

在Java集合中有兩類,一類是List,一類是Set

他們之間的區別就在於List集合中的元素師有序的,且可以重復,而Set集合中元素是無序不可重復的。


對於List好處理,但是對於Set而言我們要如何來保證元素不重復呢?


通過迭代來equals()是否相等。數據量小還可以接受,當我們的數據量大的時候效率可想而知(當然我們可以利用演算法進行優化)。


比如我們向HashSet插入1000數據,難道我們真的要迭代1000次,調用1000次equals()方法嗎?hashCode提供了解決方案。


怎麼實現?我們先看hashCode的源碼(Object)。

publicnativeinthashCode();
它是一個本地方法,它的實現與本地機器有關,這里我們暫且認為他返回的是對象存儲的物理位置(實際上不是,這里寫是便於理解)。

當我們向一個集合中添加某個元素,集合會首先調用hashCode方法,這樣就可以直接定位它所存儲的位置,

  1. 若該處沒有其他元素,則直接保存。

  2. 若該處已經有元素存在,就調用equals方法來匹配這兩個元素是否相同,

  3. 相同則不存,不同則散列到其他位置。


這樣處理,當我們存入大量元素時就可以大大減少調用equals()方法的次數,極大地提高了效率。


所以hashCode在上面扮演的角色為尋域(尋找某個對象在集合中區域位置)。


hashCode可以將集合分成若干個區域,每個對象都可以計算出他們的hash碼,可以將hash碼分組,每個分組對應著某個存儲區域,根據一個對象的hash碼就可以確定該對象所存儲區域,這樣就大大減少查詢匹配元素的數量,提高了查詢效率。

⑥ 誰知道,在java里,object提供的hashcode是如何計算的,我看源代碼是native類型

Java對於eqauls方法和hashCode方法是這樣規定的:

1、如果兩個對象相同,那麼它們的hashCode值一定要相同;

2、如果兩個對象的hashCode相同,它們並不一定相同 上面說的對象相同指的是用eqauls方法比較。 你當然可以不按要求去做了,但你會發現,相同的對象可以出現在Set集合中。同時,增加新元素的效率會大大下降。

如果你改寫了equal()方法,令兩個實際不是一個對象的兩個實例在邏輯上相等了,但是hashcode卻是不等。

所以要記得改寫hashcode。

不改寫會帶來什麼後果呢?當然,比如你在用hashmap,hashtable之類的設計hashcode的類的時候,就會出麻煩了。

至於如何改寫一個hashcode,這就有好有壞了,看各人的功底了。現在還有專門的人在研究優秀的hash演算法。

也就是說 List 是一個有序的、可重復的對象容器介面,Set是一個無序的、不可重復的對象容器介面 。後面都講了 Set 是如何實現不重復的 :為了避免多次重復的使用 equal 方法帶來的系統負擔 ,set 首先調用hashCode 方法來檢測 是否被佔用 如果被佔用 然後調用 equal 方法判斷被佔用的是否相同

⑦ JAVA 為什麼它們的hashcode 是一樣的

這個就是String這個類覆蓋hashcode的源碼


他是一個個字元轉成char進行相加

⑧ Object的hashcode()方法是怎麼實現的啊,內部的演算法是什麼啊

默認的hashCode的值好像是對象存儲的邏輯地址,但是不是直接使用這個地址還是經過一個演算法就不得而知了,具體的演算法也只有sun公司的人才知道,看源碼是沒用的,hashCode使用的是本地方法。

⑨ 重寫equals時什麼時候調用hashcode啊 源碼中也沒見顯示調用啊!求大神指點

hashCode方法是為了保證相同的對象具有相同的hashCode編碼這種java默認機制
具體怎麼用那是下一層的事情,不是我們這些做java頂層應用開發人員的考慮的事情

⑩ java hashcode 有什麼用

在Java集合中有兩類,一類是List,一類是Set

他們之間的區別就在於List集合中的元素師有序的,且可以重復,而Set集合中元素是無序不可重復的。

對於List好處理,但是對於Set而言我們要如何來保證元素不重復呢?

通過迭代來equals()是否相等。數據量小還可以接受,當我們的數據量大的時候效率可想而知(當然我們可以利用演算法進行優化)。

比如我們向HashSet插入1000數據,難道我們真的要迭代1000次,調用1000次equals()方法嗎?hashCode提供了解決方案。

怎麼實現?我們先看hashCode的源碼(Object)。


publicnativeinthashCode();它是一個本地方法,它的實現與本地機器有關,這里我們暫且認為他返回的是對象存儲的物理位置(實際上不是,這里寫是便於理解)。

當我們向一個集合中添加某個元素,集合會首先調用hashCode方法,這樣就可以直接定位它所存儲的位置,

  • 若該處沒有其他元素,則直接保存。

  • 若該處已經有元素存在,就調用equals方法來匹配這兩個元素是否相同,

  • 相同則不存,不同則散列到其他位置。

  • 這樣處理,當我們存入大量元素時就可以大大減少調用equals()方法的次數,極大地提高了效率。

    所以hashCode在上面扮演的角色為尋域(尋找某個對象在集合中區域位置)。

    hashCode可以將集合分成若干個區域,每個對象都可以計算出他們的hash碼,可以將hash碼分組,每個分組對應著某個存儲區域,根據一個對象的hash碼就可以確定該對象所存儲區域,這樣就大大減少查詢匹配元素的數量,提高了查詢效率。

熱點內容
go語言編譯模式 發布:2025-01-20 19:57:25 瀏覽:405
超能編程 發布:2025-01-20 19:56:26 瀏覽:1000
安卓手機怎麼連藍牙汽車 發布:2025-01-20 19:39:05 瀏覽:253
保定軍工存儲廠家 發布:2025-01-20 19:38:53 瀏覽:795
雲伺服器ecs服務條款 發布:2025-01-20 19:19:36 瀏覽:47
安卓系統顯示屏怎麼設置屏保 發布:2025-01-20 19:18:53 瀏覽:896
有鎖機和配置鎖哪個好 發布:2025-01-20 19:18:05 瀏覽:767
安卓版軟體如何設置 發布:2025-01-20 18:58:53 瀏覽:58
java中級項目案例 發布:2025-01-20 18:58:52 瀏覽:913
sql日誌查看工具 發布:2025-01-20 18:57:12 瀏覽:243