摘要:筆記今天學(xué)習(xí)了中的和區(qū)別,簡(jiǎn)單記錄下。因?yàn)槊看尾僮鞫紩?huì)設(shè)計(jì)鏈表的第一個(gè)元素,所以只給鏈表第一位元素加鎖如果有哪些不對(duì)的地方煩請(qǐng)指認(rèn),先行感謝
Map 筆記
今天學(xué)習(xí)了 map 中的 hashMap 和 concurrentHashMap 區(qū)別,簡(jiǎn)單記錄下。
1.JDk1.7hashmap:
hashmap 是數(shù)組和鏈表的組合結(jié)構(gòu),線程不安全
hashmap 默認(rèn)長(zhǎng)度為 16,默認(rèn)加載因子為 0.75,hashmap 添加數(shù)據(jù)時(shí),添加后的長(zhǎng)度大于等于原來(lái)長(zhǎng)度*加載因子時(shí)會(huì)擴(kuò)容,默認(rèn)增加為原來(lái)的 2 倍
hashmap 指定長(zhǎng)度和加載因子初始化構(gòu)造方法時(shí),hashmap 的長(zhǎng)度初始化為大于等于指定長(zhǎng)度的 2 的次方的值
hashmap 的長(zhǎng)度總是為 2 的次方,主要是為了方便通過(guò)尋找到 entry 對(duì)象存在那個(gè)數(shù)組節(jié)點(diǎn)。
put() 方法操作時(shí),先通過(guò) hashcode 位運(yùn)算和與運(yùn)算后得到 hash,再通過(guò) hash & (hashmap長(zhǎng)度-1) 尋找到entry對(duì)象存在那個(gè)數(shù)組節(jié)點(diǎn),然后得到這個(gè)節(jié)點(diǎn)存放的鏈表,如果為 null,直接存放,如果不為 null,則通過(guò) key 判斷是否有自己存放的 key 的 entry,有直接替換 value,返回 oldvalue,如果沒(méi)有判斷鏈表長(zhǎng)度,最后放在鏈表頭部,然后存放鏈表原來(lái)頭部 entry 的下標(biāo) next,鏈表下移
擴(kuò)容時(shí),數(shù)組元素中鏈表的順序和原來(lái)存放的順序剛好相反,并且會(huì)出現(xiàn)死循環(huán)的問(wèn)題
hashtable:線程安全,給 put() 方法加了個(gè) synchronized,效率慢
concurrentHashMap: 構(gòu)造方法中比 hashmap 多個(gè)級(jí)別level的參數(shù),該 map 把一個(gè)entry數(shù)組分為了 level 個(gè),segment,并且每個(gè)都加鎖,每個(gè) segment 的長(zhǎng)度為 map 的長(zhǎng)度/level
hashmap:
相對(duì)于 jdk1.7 的區(qū)別:
put() 方法插入元素,追加在鏈表的尾部,而不是插入頭部再向下移動(dòng)一位
鏈表長(zhǎng)度大于等于8時(shí)會(huì)樹(shù)化為紅黑樹(shù)結(jié)構(gòu)
concurrentHashMap:
相對(duì)于 jdk1.7 的區(qū)別:沒(méi)有了 segment。因?yàn)槊看尾僮鞫紩?huì)設(shè)計(jì)鏈表的第一個(gè)元素,所以只給鏈表第一位元素加鎖
如果有哪些不對(duì)的地方煩請(qǐng)指認(rèn),先行感謝
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/75348.html
摘要:二求文件中包含包租婆的行數(shù)從一個(gè)總計(jì)行的文件中找出所有包含包租婆的行數(shù),我們不用太動(dòng)腦筋就有一個(gè)算法讀一行,判斷這一行有包租婆嗎如果有,全局變量加。在臺(tái)機(jī)器上分別執(zhí)行笨辦法計(jì)算包含包租婆的行數(shù)。 一、搬磚 vs. 分布式計(jì)算 一個(gè)人搬磚很累,幾個(gè)人一起搬就會(huì)輕松很多,也會(huì)快很多: showImg(https://segmentfault.com/img/bVp6EK); 分布并行計(jì)算和...
摘要:簡(jiǎn)單模式記錄多個(gè)累加值在之前的版本中,我們創(chuàng)建了很多中間變量,。接下來(lái),我們給自己設(shè)一個(gè)挑戰(zhàn),使用鏈?zhǔn)讲僮?,將所有的函?shù)調(diào)用組合起來(lái),不再使用中間變量。你甚至可以繼續(xù)簡(jiǎn)化上述代碼,移除不必要的中間變量,讓最終的計(jì)算代碼只有一行。 譯者按: 有時(shí)候一個(gè)算法的直觀、簡(jiǎn)潔、高效是需要作出取舍的。 原文: FUNCTIONAL JAVASCRIPT: FIVE WAYS TO CALCULA...
摘要:經(jīng)過(guò)上述討論,我們發(fā)現(xiàn),哈希查找的時(shí)間復(fù)雜度最小沒(méi)有沖突是二是什么首先是中的一個(gè)接口。在中,有很多類實(shí)現(xiàn)了接口,就是其中的一個(gè)三是什么是一個(gè)實(shí)現(xiàn)了接口的基于哈希表的類。 我們要想知道HashMap是什么就先要了解Hash和Map是什么 一、Hash是什么 ① 哈希查找是一種數(shù)據(jù)結(jié)構(gòu)中用于 查找 的算法,相比于其他查找算法,他的時(shí)間復(fù)雜度更 低,所以在實(shí)際應(yīng)用中大量采取了哈希表的方...
閱讀 3168·2021-09-08 10:43
閱讀 1096·2019-08-30 15:53
閱讀 1093·2019-08-30 13:51
閱讀 923·2019-08-29 14:03
閱讀 870·2019-08-26 18:35
閱讀 1294·2019-08-26 13:38
閱讀 1677·2019-08-26 10:34
閱讀 3575·2019-08-26 10:21