hashcode源碼
① 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方法,這樣就可以直接定位它所存儲的位置,
若該處沒有其他元素,則直接保存。
若該處已經有元素存在,就調用equals方法來匹配這兩個元素是否相同,
相同則不存,不同則散列到其他位置。
這樣處理,當我們存入大量元素時就可以大大減少調用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碼就可以確定該對象所存儲區域,這樣就大大減少查詢匹配元素的數量,提高了查詢效率。