百度知道之一:
在Java中,哈希碼代表了對象的一種特征,例如我們判斷某兩個字符串是否==,如果其哈希碼相等,則這兩個字符串是相等的。其次,哈希碼是一種數(shù)據(jù)結(jié)構(gòu)的算法。常見的哈希碼的算法有:
1:Object類的hashCode.返回對象的內(nèi)存地址經(jīng)過處理后的結(jié)構(gòu),由于每個對象的內(nèi)存地址都不一樣,所以哈希碼也不一樣。
2:String類的hashCode.根據(jù)String類包含的字符串的內(nèi)容,根據(jù)一種特殊算法返回哈希碼,只要字符串內(nèi)容相同,返回的哈希碼也相同。
3:Integer類,返回的哈希碼就是Integer對象里所包含的那個整數(shù)的數(shù)值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可見,2個一樣大小的Integer對象,返回的哈希碼也一樣。
百度知道之二:
用最簡單的方法來說,hashcode就是一個簽名。當兩個對象的hashcode一樣時,兩個對象就有可能一樣。如果不一樣的話兩個對象就肯定不一樣。
一般用hashcode來進行比較兩個東西是不是一樣的,可以很容易的排除許多不一樣的東西。
最常用的地方就是在一堆東西里找一個東西。先用你要找的東西的hashcode和所有東西的hashcode比較,如果不一樣的話就肯定不是你要找的東西。如果一樣的話就很可能是你要找的東西。然后再進行仔細的比較兩個東西是不是真的一模一樣。
//一個不能加重復(fù)內(nèi)容的容器
class Set {
Object[] objs = new Object[10]; //裝東西的的數(shù)組
int size = 0; //已經(jīng)有幾個東西
//添加新東西,成功的話返回true,如果已經(jīng)有了的話返回false
boolean add(Object o) {
for(int i=0;i
if(objs[i].hashCode() == o.hashCode()) //如果hashcode一樣的話就說明兩個有可能是一樣的
if(objs[i].equals(o)) return false; //仔細的確認一下是不是真的一樣,如果一樣的話就不加入這個對象
}
objs[size++]=o; //確認沒有過這個東西,加入數(shù)組
return true;
}
}
當使用這個類的時候要確保兩個一樣的東西的hashcode肯定是一樣的。兩個不同的東西的hashcode可以是一樣的,不過這樣會減慢運行速度,所以盡量避免(也就是所謂的碰撞)。
百度知道之三:
1.一個對象的散列碼,什么是散列碼呢,簡單的說就是通過哈希算法算出來的一大竄數(shù)字之類的東西和內(nèi)存有關(guān).
如果對象1和對象2相等,說明他們的散列碼相等!反過來就不一樣了!
2.另外hashcode可以減少equals比較的次數(shù),提高運算效率。如果你想深入hashcode到底怎么回事,還是查下權(quán)威資料!
HashCode有什么用?
出自:https://blog.csdn.net/zhangyuan19880606/article/details/51240372
回到最關(guān)鍵的問題,HashCode有什么用?不妨舉個例子:
1、假設(shè)內(nèi)存中有0 1 2 3 4 5 6 7 8這8個位置,如果我有個字段叫做ID,那么我要把這個字段存放在以上8個位置之一,如果不用HashCode而任意存放,那么當查找時就需要到8個位置中去挨個查找
2、使用HashCode則效率會快很多,把ID的HashCode%8,然后把ID存放在取得余數(shù)的那個位置,然后每次查找該類的時候都可以通過ID的HashCode%8求余數(shù)直接找到存放的位置了
3、如果ID的HashCode%8算出來的位置上本身已經(jīng)有數(shù)據(jù)了怎么辦?這就取決于算法的實現(xiàn)了,比如ThreadLocal中的做法就是從算出來的位置向后查找第一個為空的位置,放置數(shù)據(jù);HashMap的做法就是通過鏈式結(jié)構(gòu)連起來。反正,只要保證放的時候和取的時候的算法一致就行了。
4、如果ID的HashCode%8相等怎么辦(這種對應(yīng)的是第三點說的鏈式結(jié)構(gòu)的場景)?這時候就需要定義equals了。先通過HashCode%8來判斷類在哪一個位置,再通過equals來在這個位置上尋找需要的類。對比兩個類的時候也差不多,先通過HashCode比較,假如HashCode相等再判斷equals。如果兩個類的HashCode都不相同,那么這兩個類必定是不同的。
舉個實際的例子Set。我們知道Set里面的元素是不可以重復(fù)的,那么如何做到?Set是根據(jù)equals()方法來判斷兩個元素是否相等的。比方說Set里面已經(jīng)有1000個元素了,那么第1001個元素進來的時候,最多可能調(diào)用1000次equals方法,如果equals方法寫得復(fù)雜,對比的東西特別多,那么效率會大大降低。使用HashCode就不一樣了,比方說HashSet,底層是基于HashMap實現(xiàn)的,先通過HashCode取一個模,這樣一下子就固定到某個位置了,如果這個位置上沒有元素,那么就可以肯定HashSet中必定沒有和新添加的元素equals的元素,就可以直接存放了,都不需要比較;如果這個位置上有元素了,逐一比較,比較的時候先比較HashCode,HashCode都不同接下去都不用比了,肯定不一樣,HashCode相等,再equals比較,沒有相同的元素就存,有相同的元素就不存。如果原來的Set里面有相同的元素,只要HashCode的生成方式定義得好(不重復(fù)),不管Set里面原來有多少元素,只需要執(zhí)行一次的equals就可以了。這樣一來,實際調(diào)用equals方法的次數(shù)大大降低,提高了效率。