目錄
今天學習了 map 中的 hashmap 和 concurrenthashmap 區別,簡單記錄下。
hashmap:
hashmap 是陣列和鍊錶的組合結構,執行緒不安全
hashmap 預設長度為 16,預設載入因子為 0.75,hashmap 新增資料時,新增後的長度大於等於原來長度*載入因子時會擴容,預設增加為原來的 2 倍
hashmap 指定長度和載入因子初始化構造方法時,hashmap 的長度初始化為大於等於指定長度的 2 的次方的值
hashmap 的長度總是為 2 的次方,主要是為了方便通過尋找到 entry 物件存在那個陣列節點。
put() 方法操作時,先通過 hashcode 位運算和與運算後得到 hash,再通過 hash & (hashmap長度-1) 尋找到entry物件存在那個陣列節點,然後得到這個節點存放的鍊錶,如果為 null,直接存放,如果不為 null,則通過 key 判斷是否有自己存放的 key 的 entry,有直接替換 value,返回 oldvalue,如果沒有判斷鍊錶長度,最後放在鍊錶頭部,然後存放鍊錶原來頭部 entry 的下標 next,鍊錶下移
擴容時,陣列元素中煉表的順序和原來存放的順序剛好相反,並且會出現死迴圈的問題
hashtable:執行緒安全,給 put() 方法加了個 synchronized,效率慢
concurrenthashmap:構造方法中比 hashmap 多個級別level的引數,該 map 把乙個entry陣列分為了 level 個,segment,並且每個都加鎖,每個 segment 的長度為 map 的長度/level
hashmap:
相對於 jdk1.7 的區別:
put() 方法插入元素,追加在鍊錶的尾部,而不是插入頭部再向下移動一位
鍊錶長度大於等於8時會樹化為紅黑樹結構
concurrenthashmap:
相對於 jdk1.7 的區別:沒有了 segment。因為每次操作都會設計鍊錶的第乙個元素,所以只給鍊錶第一位元素加鎖
如果有哪些不對的地方煩請指認,先行感謝
合併表記錄(map)
題目描述 資料表記錄包含表索引和數值,請對錶索引相同的記錄進行合併,即將相同索引的數值進行求和運算,輸出按照key值公升序進行輸出。輸入描述 先輸入鍵值對的個數 然後輸入成對的index和value值,以空格隔開 輸出描述 輸出合併後的鍵值對 多行 輸入例子 4 0 1 0 2 1 2 3 4輸出例...
map記錄下標
小雲正在參與開發乙個即時聊天工具,他負責其中的會話列表部分。會話列表為顯示為乙個從上到下的多行控制項,其中每一行表示乙個會話,每乙個會話都可以以乙個唯一正整數id表示。當使用者在乙個會話中傳送或接收資訊時,如果該會話已經在會話列表中,則會從原來的位置移到列表的最上方 如果沒有在會話列表中,則在會話列...
map容器簡單應用
需要按照編號將一組資料排序顯示,我一下子就想到了容器。以前曾經用過map,所以還是用map來實現吧。之前,完整地看完了 c 標準程式庫 並且也讀過侯捷老師的 stl原始碼剖析 對容器的特性和使用有了一點印象 我沒有經常應用,不敢說非常熟悉 網上有勤奮好學的前輩們總結的好文章 這兒 有一篇,是關於ma...