總結:常用方法:
//遍歷所有的key集:keyset()
set set = map.
keyset()
; iterator iterator = set.
iterator()
;while
(iterator.
hasnext()
)//遍歷所有的value集:values()
collection values = map.
values()
;for
(object obj : values)
//方式一:entryset()
set entryset = map.
entryset()
; iterator iterator1 = entryset.
iterator()
;while
(iterator1.
hasnext()
)//方式二:
set keyset = map.
keyset()
; iterator iterator2 = keyset.
iterator()
;while
(iterator2.
hasnext()
)
hashmap的底層實現原理?以jdk7為例說明:
hashmap map = new hashmap():
在例項化以後,底層建立了長度是16的一維陣列entry table。
…可能已經執行過多次put…
map.put(key1,value1):
首先,呼叫key1所在類的hashcode()計算key1雜湊值,此雜湊值經過某種演算法計算以後,得到在entry陣列中的存放位置。
如果此位置上的資料為空,此時的key1-value1新增成功。 ----情況1
如果此位置上的資料不為空,(意味著此位置上存在乙個或多個資料(以鍊錶形式存在)),比較key1和已經存在的乙個或多個資料的雜湊值:
如果key1的雜湊值與已經存在的資料的雜湊值都不相同,此時key1-value1新增成功。----情況2
如果key1的雜湊值和已經存在的某乙個資料(key2-value2)的雜湊值相同,繼續比較:呼叫key1所在類的equals(key2)方法,比較:
如果equals()返回false:此時key1-value1新增成功。----情況3
如果equals()返回true:使用value1替換value2。
補充:關於情況2和情況3:此時key1-value1和原來的資料以鍊錶的方式儲存。
在不斷的新增過程中,會涉及到擴容問題,當超出臨界值(0.75。且要存放的位置非空)時,擴容。預設的擴容方式:擴容為原來容量的2倍,並將原有的資料複製過來。
jdk8 相較於jdk7在底層實現方面的不同:
new hashmap():底層沒有建立乙個長度為16的陣列
jdk 8底層的陣列是:node,而非entry
首次呼叫put()方法時,底層建立長度為16的陣列
jdk7底層結構只有:陣列+鍊錶。jdk8中底層結構:陣列+鍊錶+紅黑樹。
4.1 形成鍊錶時,七上八下(jdk7:新的元素指向舊的元素。jdk8:舊的元素指向新的元素)
4.2 當陣列的某乙個索引位置上的元素以鍊錶形式存在的資料個數 > 8 且當前陣列的長度 > 64時,此時此索引位置上的所資料改為使用紅黑樹儲存。
原始碼重要常量:
treemap判斷兩個key相等的標準:兩個key通過compareto()方法或
者compare()方法返回0。
集合之Set(隨筆)
set介面 儲存無序的 不可重複的資料 以hashset為例說明 1.無序性 不等於隨機性。儲存的資料在底層陣列中並非按照陣列索引的順序新增,而是根據資料的雜湊值決定的。2.不可重複性 保證新增的元素按照equals 判斷時,不能返回true.即 相同的元素只能新增乙個。新增元素的過程 對於新增成功...
集合詳解之 Map
碼上生花,echarts 作品展示賽正式啟動!以下是 map 的繼承關係圖 map 常用的實現類如下 常用方法包括 put remove get size 等,所有方法如下圖 增加元素 hashmap.put name 老王 hashmap.put age 30 hashmap.put 你猜 刪除元...
JAVA 集合之Map介面
map介面 集合框架中的另乙個父介面 map集合 另名為雜湊表 用於儲存一一對應的元素資料,第乙個物件可以作為索引,第二個物件作為值,我們稱之為key value,鍵值對。1 以key value形式進行儲存。2 key與value都必須是引用型別。3 key可以為null。4 key與value是...