1疼蛾、stack 和 queue 都是在Deque基礎(chǔ)上實現(xiàn)的载绿,屬于一種適配
2唉侄、set也是在map基礎(chǔ)上實現(xiàn)的育勺,僅僅用到了map的key【java里 hashset與hashmap區(qū)別:hashset靠hashmap實現(xiàn),只有沒有用object厉颤,只用key】
3穴豫、【這里多提到一個線程安全的概念,java里線程安全的版本是在普通集合的基礎(chǔ)上逼友,重新包裝每個方法精肃,并加上“Synchronized”關(guān)鍵字實現(xiàn)的】
4、Unordered的 map和set版本基于hash表實現(xiàn)的【java里帜乞,bean對象重載hashCode和equals方法可以實現(xiàn)hash表的功能司抱,oc同理】
5、hash表有兩種實現(xiàn)方法黎烈,侯老師講的是拉鏈式
1习柠、拉鏈式:
????????將大小為M的數(shù)組的每一個元素指向一條鏈表匀谣,鏈表中的每一個節(jié)點都存儲一個哈希值為該索引的鍵,對采用拉鏈法的哈希實現(xiàn)的查找:首先是根據(jù)哈希值找到對應(yīng)的鏈表【hashCode】资溃,然后沿著鏈表順序找到相應(yīng)的鍵【equals】武翎。(使用鏈接法在最壞的情況下,也就是將所有的key映射到同一個槽中了溶锭,這樣哈希表就退化成一個鏈表宝恶,這樣的話,操作鏈表的時間復(fù)雜度則變成了O(n)趴捅,這樣哈希表的性能優(yōu)勢就沒有了垫毙,所以選擇一個合適的哈希函數(shù)是最為關(guān)鍵的)
2、開放尋址
? ??使用開放尋址法是槽本身直接存放數(shù)據(jù)拱绑,在插入數(shù)據(jù)時如果key所映射到的索引已經(jīng)有數(shù)據(jù)了综芥,這說明發(fā)生了沖突,這時會尋找下一個槽猎拨,如果該槽也被占用了則繼續(xù)尋找下一個槽膀藐,直到找到?jīng)]有被占用的槽,在查找時也使用同樣的策略來進行迟几。
????由于開放尋址法處理沖突的時候占用的是其他槽的位置消请,這可能導(dǎo)致后續(xù)的key在插入的時候更加容易出現(xiàn)哈希沖突,所以采用開放尋址法的哈希表的裝載因子不能太高类腮,否則容易出現(xiàn)性能下降。
????裝載因子是哈希表保存的元素數(shù)量和哈希表容量的比蛉加,通常采用鏈接法解決哈希沖突的哈希表的裝載因子最好不要大于1蚜枢,而采用開放尋址法的哈希表最好不要大于0.5.