在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的對映,值對映可以值
public set
keyset()
return ks;
}// values的對映
public collection
values()
return vs;
}// 乙個鍵值對的對映,可以把entry理解為set中的元素
public set
>
entryset()
***注意:***map集合不可以在迴圈中增刪集合元素,但是在迭代器中可以使用迭代器的刪除, *延伸:*hashmap是排序的,也是有一定順序的,他是按照key的hash碰撞計算輸出的
有序是指輸出順序是按照插入順序輸出的,
排序是指按照一定順序排序的
無序是指插入的順序和儲存的順序不一致
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...