在jdk1.8之前是資料+鍊錶方式存`在這裡插入**片`儲,從jdk、1,.8開始以資料+鍊錶+紅黑樹方式儲存,
具體的儲存方式時根據key來hash碰撞計算key的hash值,來找到對應的陣列中的下標,在判斷鍊錶的next儲存,當單個鍊錶多於8個,並且總的數多於64是啟動resize從新排序,此時才加入紅黑樹
// hashmap的初始化的方式,注意的是這裡的初始化是不會建立物件的,只是設定了初始化因子
// 包含初始化容量和初始化因子
public
hashmap
(int initialcapacity,
float loadfactor)
// 2.值設定初始化容量
public
hashmap
(int initialcapacity)
// 採用預設的初始化,容量為16.載入因子為0.75
public
hashmap()
// 採用基礎的方式賦初值
public
hashmap
(map<
?extendsk,
?extends
v> m)
// resize衝原始碼的注釋上可以了解到此方法不僅僅用來擴大空間,還用來初始化
final node
resize()
// 擴容,這裡採用的是左移1位,即擴大1倍的方式,這是計算機友好的方式買這種效率比較高
elseif(
(newcap = oldcap <<1)
< maximum_capacity &&
oldcap >= default_initial_capacity)
newthr = oldthr <<1;
// double threshold
}else
if(oldthr >0)
// initial capacity was placed in threshold
newcap = oldthr;
else
if(newthr ==0)
threshold = newthr;
@suppresswarnings()
node
newtab =
(node
)new
node
[newcap]
; table = newtab;
if(oldtab != null)
else
}while
((e = next)
!= null);if
(lotail != null)
if(hitail != null)}}
}}return newtab;
}
// hashmap的移除
public v remove
(object key)
final node
removenode
(int hash, object key, object value,
boolean matchvalue,
boolean movable)
p = e;
}while
((e = e.next)
!= null);}
}if(node != null &&
(!matchvalue ||
(v = node.value)
== value ||
(value != null && value.
equals
(v))))
}return null;
}// 清空map集合
public
void
clear()
}
***注意:***map集合不可以在迴圈中增刪集合元素,但是在迭代器中可以使用迭代器的刪除, *延伸:*hashmap是排序的,也是有一定順序的,他是按照key的hash碰撞計算輸出的// map的對映,值對映可以值
public set
keyset()
return ks;
}// values的對映
public collection
values()
return vs;
}// 乙個鍵值對的對映,可以把entry理解為set中的元素
public set
>
entryset()
有序是指輸出順序是按照插入順序輸出的,
排序是指按照一定順序排序的
無序是指插入的順序和儲存的順序不一致
HashMap原始碼理解
map子類常用有 hashmap 無序 和treemap 有序 hashmap hashmap的特點 無序 hash 執行緒不安全,陣列 鍊錶實現 對應的hashtable加了同步鎖 synchronized同步鎖 執行緒安全 hashmap底層是 陣列 鍊錶實現的,陣列下下標存放的是hashcod...
HashMap原始碼系列 HashMap的屬性
public class hashmap extends abstractmap implements map,cloneable,serializable容載因子 容載因子越大,table陣列中儲存的資料越密集,碰撞的可能性就越大。容載因子越小,儲存越稀疏,碰撞的可能性就越小,不過浪費儲存空間。轉...
HashMap原始碼解讀
一 建立乙個hashmap都做了哪些工作?mapmap new hashmap hahmap無參構造方法 public hashmap 可以看到設定了載入因子 預設0.75 閾值 預設容量16 預設載入因子0.75 12 table是hashmap內部資料儲存結構entry陣列。當hashmap的s...