中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

wordpress取消置頂seo優(yōu)化公司排名

wordpress取消置頂,seo優(yōu)化公司排名,前端開發(fā)學(xué)哪些,wordpress如何修改登錄地址HashSet 如何檢查重復(fù)? 當(dāng)你把對(duì)象加入HashSet時(shí),HashSet 會(huì)先計(jì)算對(duì)象的hashcode值來判斷對(duì)象加入的位置,同時(shí)也會(huì)與其他加入的對(duì)象的 hashcode 值作比較,如果沒有相符的 hashcode,HashSet 會(huì)假設(shè)對(duì)象沒有重復(fù)出現(xiàn)。但是如果發(fā)…

HashSet 如何檢查重復(fù)?

當(dāng)你把對(duì)象加入HashSet時(shí),HashSet 會(huì)先計(jì)算對(duì)象的hashcode值來判斷對(duì)象加入的位置,同時(shí)也會(huì)與其他加入的對(duì)象的 hashcode 值作比較,如果沒有相符的 hashcodeHashSet 會(huì)假設(shè)對(duì)象沒有重復(fù)出現(xiàn)。但是如果發(fā)現(xiàn)有相同 hashcode 值的對(duì)象,這時(shí)會(huì)調(diào)用equals()方法來檢查 hashcode 相等的對(duì)象是否真的相同。如果兩者相同,HashSet 就不會(huì)讓加入操作成功。

在 JDK1.8 中,HashSetadd()方法只是簡單的調(diào)用了HashMapput()方法,并且判斷了一下返回值以確保是否有重復(fù)元素。直接看一下HashSet中的源碼:

// Returns: true if this set did not already contain the specified element
// 返回值:當(dāng) set 中沒有包含 add 的元素時(shí)返回真
public boolean add(E e) {return map.put(e, PRESENT)==null;
}

而在HashMapputVal()方法中也能看到如下說明:

// Returns : previous value, or null if none
// 返回值:如果插入位置沒有元素返回null,否則返回上一個(gè)元素
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {
...
}

也就是說,在 JDK1.8 中,實(shí)際上無論HashSet中是否已經(jīng)存在了某元素,HashSet都會(huì)直接插入,只是會(huì)在add()方法的返回值處告訴我們插入前是否存在相同元素。

HashMap 的底層實(shí)現(xiàn)

JDK1.8 之前

JDK1.8 之前 HashMap 底層是 數(shù)組和鏈表 結(jié)合在一起使用也就是 鏈表散列。HashMap 通過 key 的 hashcode 經(jīng)過擾動(dòng)函數(shù)處理過后得到 hash 值,然后通過 (n - 1) & hash 判斷當(dāng)前元素存放的位置(這里的 n 指的是數(shù)組的長度),如果當(dāng)前位置存在元素的話,就判斷該元素與要存入的元素的 hash 值以及 key 是否相同,如果相同的話,直接覆蓋,不相同就通過拉鏈法解決沖突。

HashMap 中的擾動(dòng)函數(shù)(hash 方法)是用來優(yōu)化哈希值的分布。通過對(duì)原始的 hashCode() 進(jìn)行額外處理,擾動(dòng)函數(shù)可以減小由于糟糕的 hashCode() 實(shí)現(xiàn)導(dǎo)致的碰撞,從而提高數(shù)據(jù)的分布均勻性。

JDK 1.8 HashMap 的 hash 方法源碼:

JDK 1.8 的 hash 方法 相比于 JDK 1.7 hash 方法更加簡化,但是原理不變。

    static final int hash(Object key) {int h;// key.hashCode():返回散列值也就是hashcode// ^:按位異或// >>>:無符號(hào)右移,忽略符號(hào)位,空位都以0補(bǔ)齊return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);}

對(duì)比一下 JDK1.7 的 HashMap 的 hash 方法源碼.

static int hash(int h) {// This function ensures that hashCodes that differ only by// constant multiples at each bit position have a bounded// number of collisions (approximately 8 at default load factor).h ^= (h >>> 20) ^ (h >>> 12);return h ^ (h >>> 7) ^ (h >>> 4);
}

相比于 JDK1.8 的 hash 方法 ,JDK 1.7 的 hash 方法的性能會(huì)稍差一點(diǎn)點(diǎn),因?yàn)楫吘箶_動(dòng)了 4 次。

所謂 “拉鏈法” 就是:將鏈表和數(shù)組相結(jié)合。也就是說創(chuàng)建一個(gè)鏈表數(shù)組,數(shù)組中每一格就是一個(gè)鏈表。若遇到哈希沖突,則將沖突的值加到鏈表中即可。

JDK1.8 之后

相比于之前的版本, JDK1.8 之后在解決哈希沖突時(shí)有了較大的變化,當(dāng)鏈表長度大于閾值(默認(rèn)為 8)(將鏈表轉(zhuǎn)換成紅黑樹前會(huì)判斷,如果當(dāng)前數(shù)組的長度小于 64,那么會(huì)選擇先進(jìn)行數(shù)組擴(kuò)容,而不是轉(zhuǎn)換為紅黑樹)時(shí),將鏈表轉(zhuǎn)化為紅黑樹,以減少搜索時(shí)間。

TreeMap、TreeSet 以及 JDK1.8 之后的 HashMap 底層都用到了紅黑樹。紅黑樹就是為了解決二叉查找樹的缺陷,因?yàn)槎娌檎覙湓谀承┣闆r下會(huì)退化成一個(gè)線性結(jié)構(gòu)。

我們來結(jié)合源碼分析一下?HashMap?鏈表到紅黑樹的轉(zhuǎn)換。

1、?putVal?方法中執(zhí)行鏈表轉(zhuǎn)紅黑樹的判斷邏輯。

鏈表的長度大于 8 的時(shí)候,就執(zhí)行?treeifyBin?(轉(zhuǎn)換紅黑樹)的邏輯。

// 遍歷鏈表
for (int binCount = 0; ; ++binCount) {// 遍歷到鏈表最后一個(gè)節(jié)點(diǎn)if ((e = p.next) == null) {p.next = newNode(hash, key, value, null);// 如果鏈表元素個(gè)數(shù)大于TREEIFY_THRESHOLD(8)if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st// 紅黑樹轉(zhuǎn)換(并不會(huì)直接轉(zhuǎn)換成紅黑樹)treeifyBin(tab, hash);break;}if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))break;p = e;
}

?2、treeifyBin?方法中判斷是否真的轉(zhuǎn)換為紅黑樹。

final void treeifyBin(Node<K,V>[] tab, int hash) {int n, index; Node<K,V> e;// 判斷當(dāng)前數(shù)組的長度是否小于 64if (tab == null || (n = tab.length) < MIN_TREEIFY_CAPACITY)// 如果當(dāng)前數(shù)組的長度小于 64,那么會(huì)選擇先進(jìn)行數(shù)組擴(kuò)容resize();else if ((e = tab[index = (n - 1) & hash]) != null) {// 否則才將列表轉(zhuǎn)換為紅黑樹TreeNode<K,V> hd = null, tl = null;do {TreeNode<K,V> p = replacementTreeNode(e, null);if (tl == null)hd = p;else {p.prev = tl;tl.next = p;}tl = p;} while ((e = e.next) != null);if ((tab[index] = hd) != null)hd.treeify(tab);}
}

將鏈表轉(zhuǎn)換成紅黑樹前會(huì)判斷,如果當(dāng)前數(shù)組的長度小于 64,那么會(huì)選擇先進(jìn)行數(shù)組擴(kuò)容,而不是轉(zhuǎn)換為紅黑樹。

http://www.risenshineclean.com/news/45365.html

相關(guān)文章:

  • wap手機(jī)網(wǎng)站建設(shè)制作開發(fā)深圳競(jìng)價(jià)排名網(wǎng)絡(luò)推廣
  • 廣州番禺建網(wǎng)站什么是seo關(guān)鍵詞優(yōu)化
  • 資源交易網(wǎng)站代碼百度經(jīng)驗(yàn)手機(jī)版
  • 星裕建設(shè)網(wǎng)站朝陽seo搜索引擎
  • 南昌公司做網(wǎng)站南京百度seo排名優(yōu)化
  • 網(wǎng)站建設(shè)可行分析性報(bào)告真正永久免費(fèi)的建站系統(tǒng)有哪些
  • 千牛cdn wordpress長沙網(wǎng)站優(yōu)化推廣方案
  • 免費(fèi)網(wǎng)站建站一級(jí)av無代碼免費(fèi)web開發(fā)平臺(tái)
  • wordpress主題樣式seo軟件資源
  • 挖礦網(wǎng)站怎么做seo技術(shù)培訓(xùn)寧波
  • 郴州百度seoseo入門教學(xué)
  • 國內(nèi)網(wǎng)站不備案品牌推廣的方式有哪些
  • 今天八點(diǎn)發(fā)布的株洲疫情網(wǎng)站搜索引擎優(yōu)化主要方法
  • 網(wǎng)站圖片鏈接到視頻怎么做微信營銷推廣
  • 婚慶公司加盟連鎖品牌廣告優(yōu)化
  • 哪個(gè)網(wǎng)站專門做母嬰東營網(wǎng)站推廣公司
  • 上海app制作灰色行業(yè)seo
  • 自己建一個(gè)網(wǎng)站難嗎網(wǎng)站怎么營銷推廣
  • 五合一小程序網(wǎng)站推廣網(wǎng)站排名
  • 四川網(wǎng)站建設(shè)套餐北京網(wǎng)站seo設(shè)計(jì)
  • ppt做雜志模板下載網(wǎng)站搜索引擎排行榜前十名
  • 免費(fèi)的黃岡網(wǎng)站有哪些代碼系統(tǒng)優(yōu)化的意義
  • 把網(wǎng)站傳到服務(wù)器上怎么做新媒體運(yùn)營
  • 做網(wǎng)站是怎樣賺錢深圳全網(wǎng)營銷哪里好
  • 網(wǎng)站的排名優(yōu)化怎么做怎么做網(wǎng)頁設(shè)計(jì)的頁面
  • js網(wǎng)站模板下載軟文推廣例子
  • 關(guān)于企業(yè)網(wǎng)站建設(shè)的請(qǐng)示高清網(wǎng)站推廣免費(fèi)下載
  • 網(wǎng)站建設(shè) 中企動(dòng)力公司中山做網(wǎng)站推廣公司
  • 營銷策劃的流程南昌seo網(wǎng)站排名
  • 網(wǎng)站備案是空間備案還是域名備案友情鏈接大全