定義:hashmap是有乙個一維陣列和乙個鍊錶組成,從而得知,在解決衝突問題時,hashmap選擇的是鏈位址法。
為什麼hashmap會用乙個陣列這鍊錶組成,當時給出的答案是從那幾種解決衝突的演算法中推論的,這裡給出乙個正面的理由:
1,為什麼用了一維陣列:陣列儲存區間是連續的,占用記憶體嚴重,故空間複雜的很大。但陣列的二分查詢時間複雜度小,為o(1);陣列的特點是:定址容易,插入和刪除困難
2,為什麼用了鍊錶:鍊錶儲存區間離散,占用記憶體比較寬鬆,故空間複雜度很小,但時間複雜度很大,達o(n)。鍊錶的特點是:定址困難,插入和刪除容易
為何會形成環鏈(主要在這擴容的過程):
當多個執行緒同時對這個hashmap進行put操作,而察覺到記憶體容量不夠,需要進行擴容時,多個執行緒會同時執行resize操作,而這就出現問題了,問題的原因分析如下:
1).首先,在hashmap擴容時,會改變鍊錶中的元素的順序,將元素從鍊錶頭部插入。
2).而環形鍊錶就在這一時刻發生,以下模擬2個執行緒同時擴容。
假設,當前hashmap的空間為2(臨界值為1),hashcode分別為0和1,在雜湊位址0處有元素a和b,這時候要新增元素c,c經過hash運算,得到雜湊位址為1,
這時候由於超過了臨界值,空間不夠,需要呼叫resize方法進行擴容,那麼在多執行緒條件下,會出現條件競爭
JDK1 6 HashMap死迴圈形成原因
目錄 1.擴容形成環路 2.get key 操作死迴圈 在put元素超過負載閾值時會觸發hashmap的擴容resize操作,乙個桶的鍊錶會重新雜湊到新錶中,put 插入元素之後,負載超過閾值,觸發resize方法擴容 void addentry int hash,k key,v value,int...
疤痕是如何形成的
疤痕不僅影響了人的外貌,也是醫學上的乙個疑難症,患者對治疤十分迫切。疤痕是如何形成的?又有什麼不良後果呢?我們向永嘉東方整形外科門診部的陳金西主任作了了解。陳主任解釋說,人類身體最外表的一層是很薄的 組織,其薄處只有0.2公釐,最厚處也不過1公釐。是生命的重要器官,保護著機體的內 外環境的平衡,維持...
宣告是如何形成的
c語言中的宣告器,宣告器就是識別符號以及與它組合在一起的任何指標 函式括號 陣列下標。函式的返回值不能是乙個函式,但允許是乙個函式指標。函式的返回值不能是乙個陣列,但可以是乙個指標,或者指向陣列的指標。陣列裡面不能有函式,但允許陣列裡面還有陣列。位段的型別必須是int,unsigned int或者s...