生活随笔
收集整理的這篇文章主要介紹了
炸窝哈希值的原理
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
package asdfg;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class aaa {
public static void main(String[] args) {/*** 小提示:* 1.對(duì)于所有沒(méi)有索引的方法,我們都不能使用for循環(huán)進(jìn)行遍歷* 2.提到接口,我們就應(yīng)該想到他下面有多少個(gè)實(shí)現(xiàn)類,并且實(shí)現(xiàn)類的方法是怎樣使用的* 3.哈希表結(jié)構(gòu)的速度是非常快的* 4.哈希表的順序是無(wú)序的* 5.可以通過(guò)重寫(xiě)的方法使哈希值的值相等* * * Set接口簡(jiǎn)介:* 1.Java.util.set接口和Java.util.list接口同樣繼承來(lái)自collection接口,與collection接口中的方法基本上是一樣的,* 并沒(méi)有對(duì)collectIon接口進(jìn)行功能上的擴(kuò)充,只是比collectIon接口在形式上更加嚴(yán)格,與lIst接口不同的是,Set接口中的元素* 是無(wú)序的,并且都會(huì)以某種規(guī)則保證存入的元素不出現(xiàn)重復(fù)* 2.Set接口的兩個(gè)集合:Hashset集合和HashmAP集合* * 小問(wèn)題:* 1.Hashset是根據(jù)什么來(lái)確定元素在集合中的存儲(chǔ)位置的?具有什么功能?* 解釋:是根據(jù)對(duì)象的哈希值來(lái)確定元素在結(jié)合中的存儲(chǔ)位置,具有良好的存儲(chǔ)和查找性能,* 2.Hashset是如何保證元素在集合當(dāng)中的唯一性的?* 解釋:保障元素唯一性的方式依賴于Hashcode方法與EQuals方法*//** Set接口的特點(diǎn):* 1.不允許存儲(chǔ)重復(fù)元素* 2.沒(méi)有索引,沒(méi)有帶索引的方法也不能使用普通for循環(huán)進(jìn)行遍歷;* * java.util.HashSet集合 implements(實(shí)現(xiàn))set接口;* HshSet方法的特點(diǎn):* 1.不允許存儲(chǔ)重復(fù)元素* 2.沒(méi)有索引,沒(méi)有帶索引的方法也不能使用普通for循環(huán)進(jìn)行遍歷* 3.是一個(gè)無(wú)序的集合,存儲(chǔ)元素和起初元素的分析有可能不一致* 4.底層是一個(gè)哈希表結(jié)構(gòu),(查詢的速度是相當(dāng)迅速的)* *///創(chuàng)建一個(gè)HashSet集合Set<Integer> set= new HashSet<>();//添加元素使用add方法set.add(1);set.add(3);set.add(2);set.add(1); //1.使用迭代器進(jìn)行遍歷set集合Iterator<Integer> it=set.iterator();//判斷是否有下一個(gè)while(it.hasNext()){//如果有的話,將下一個(gè)的值進(jìn)行返回然后進(jìn)行輸出Integer n=it.next();System.out.println(n);}//2.使用增強(qiáng)for遍歷for集合System.out.println("+++++++++++++++++++++");for(Integer i :set){System.out.println(i);}//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++/*** HashSet集合存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu)使用的是哈希表,下面我們進(jìn)行了解哈希值是怎么一回事* 哈希值:是一個(gè)十進(jìn)制的整數(shù) 由系統(tǒng)隨機(jī)給值,是一個(gè)模擬地址,不是真實(shí)存在的,也就是邏輯上的地址值,注意:是邏輯地址值,而不是物理地址* * 如何獲取對(duì)象的哈希值?* 使用Object類當(dāng)中的方法來(lái)獲取對(duì)象的哈希值* 該方法位于java.long.Object類中的hashcode()方法 其作用是返回該對(duì)象的哈希值碼* * *//*** hashcode方法的源碼:* public native int hashCode();* native代表該方法調(diào)用的是本地操作系統(tǒng)的方法* * *///因?yàn)閜erson extends Object,所以可以使用其中的hashCode方法person p1=new person();int h1=p1.hashCode();//對(duì)象的哈希值System.out.println(h1);//31168322System.out.println(p1);//asdfg.person@1db9742就是上面邏輯地址當(dāng)中的十六進(jìn)制的表示//在創(chuàng)建另外的一個(gè)對(duì)象person p2=new person();int h2=p2.hashCode();//對(duì)象的哈希值System.out.println(h2);//17225372System.out.println(p2);//asdfg.person@106d69c就是上面邏輯地址當(dāng)中的十六進(jìn)制的表示//String 的哈希值String s1=new String("abc");String s2=new String("abc");System.out.println(s1.hashCode());//96354System.out.println(s2.hashCode());//96354//字符串重寫(xiě)之后的哈希值是相同的//哈希值的改變是可以通過(guò)方法的程序進(jìn)行的,如果哈希值不被重寫(xiě),就是由系統(tǒng)隨機(jī)給出的,/*** 什么是哈希表?* 在JDK1.8之前,哈希表底層采用數(shù)組+鏈表結(jié)構(gòu),及使用鏈表處理沖突,這里的沖突是指當(dāng)一個(gè)哈希值對(duì)應(yīng)多個(gè)數(shù)據(jù)的時(shí)候,不行,* 但是它位于一個(gè)桶中的元素較多及hash值相等的元素較多時(shí),通過(guò)key查找效率較低,而JDK1.8中,哈希值存儲(chǔ)結(jié)構(gòu)采用數(shù)據(jù)+鏈表+紅黑樹(shù)實(shí)現(xiàn),* 超過(guò)8(閥值)將鏈表轉(zhuǎn)換為紅黑樹(shù),這樣大大減少了查找時(shí)間,簡(jiǎn)單來(lái)說(shuō),鏈表是由數(shù)組+鏈表+紅黑樹(shù)實(shí)現(xiàn)的,* * 哈希表的結(jié)構(gòu)特點(diǎn):* 查詢速度快* * 哈希表結(jié)構(gòu)當(dāng)中數(shù)組的個(gè)數(shù)一開(kāi)始是16個(gè)塊,從0開(kāi)始,初始容量是16個(gè)* * 數(shù)組結(jié)構(gòu):將相同哈希值的元素分為一組* 鏈表/紅黑樹(shù):將哈希值相同的元素放到一起或者說(shuō)是連接到一起* */
}
}
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)
總結(jié)
以上是生活随笔為你收集整理的炸窝哈希值的原理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。