
陣列特點
存盤區間是連續,且占用記憶體嚴重,空間復雜也很大,時間復雜為O(1),
優點:是隨機讀取效率很高,原因陣列是連續(隨機訪問性強,查找速度快)
缺點:插入和洗掉資料效率低,因插入資料,這個位置后面的資料在記憶體中要往后移的,且大小固定不易動態擴展,
鏈表特點
區間離散,占用記憶體寬松,空間復雜度小,時間復雜度O(N),優點:插入洗掉速度快,記憶體利用率高,沒有大小固定,擴展靈活,缺點:不能隨機查找,每次都是從第一個開始遍歷(查詢效率低),
哈希表特點
把以上兩種結合一起使用,從而實作查詢效率高和插入洗掉效率也高的資料結構
map.put(k,v)實作原理
第一步首先將k,v封裝到Node物件當中(節點),第二步它的底層會呼叫K的hashCode()方法得出hash值,第三步通過哈希表函式/哈希演算法,將hash值轉換成陣列的下標,下標位置上如果沒有任何元素,就把Node添加到這個位置上,如果說下標對應的位置上有鏈表,此時,就會拿著k和鏈表上每個節點的k進行equal,如果所有的equals方法回傳都是false,那么這個新的節點將被添加到鏈表的末尾,如其中有一個equals回傳了true,那么這個節點的value將會被覆寫,
map.get(k)實作原理
第一步:先呼叫k的hashCode()方法得出哈希值,并通過哈希演算法轉換成陣列的下標,第二步:通過上一步哈希演算法轉換成陣列的下標之后,在通過陣列下標快速定位到某個位置上,重點理解如果這個位置上什么都沒有,則回傳null,如果這個位置上有單向鏈表,那么它就會拿著引數K和單向鏈表上的每一個節點的K進行equals,如果所有equals方法都回傳false,則get方法回傳null,如果其中一個節點的K和引數K進行equals回傳true,那么此時該節點的value就是我們要找的value了,get方法最侄訓傳這個要找的value,
為何隨機增刪、查詢效率都很高的原因是?
原因:增刪是在鏈表上完成的,而查詢只需掃描部分,則效率高,
HashMap集合的key,會先后呼叫兩個方法,hashCode and equals方法,這這兩個方法都需要重寫,
HashMap總結
無序,不可重復為什么是無序的?因為不一定掛到哪一個單向鏈表上的,因此加入順序和取出也不一樣,怎么保持不可重復?使用equals方法來保證HashMap集合key不可重復,如key重復來,value就會覆寫,存放在HashMap集合key部分的元素,其實就是存放在HashSet集合中,則HashSet集合也需要重寫equals和hashCode方法,hashmap集合的默認初始化容量為16,默認加載因子為0.75,也就是說這個默認加載因子是當hashMap集合底層陣列的容量達到75%時,陣列就開始擴容,hashmap集合初始化容量是2的陪數,為了達到散列均勻,提高hashmap集合的存取效率,
HashMap死鎖原因:
HashMap會造成死鎖,因為HashMap是執行緒非安全的,多并發的情況容易造成死鎖,若要高并發推薦使用ConcurrentHashMap,這里的加了鎖,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/267477.html
標籤:其他
