


1、stack 和 queue 都是在Deque基礎上實現(xiàn)的,屬于一種適配
2、set也是在map基礎上實現(xiàn)的,僅僅用到了map的key【java里 hashset與hashmap區(qū)別:hashset靠hashmap實現(xiàn),只有沒有用object,只用key】
3、【這里多提到一個線程安全的概念,java里線程安全的版本是在普通集合的基礎上,重新包裝每個方法,并加上“Synchronized”關鍵字實現(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ù)哈希值找到對應的鏈表【hashCode】,然后沿著鏈表順序找到相應的鍵【equals】。(使用鏈接法在最壞的情況下,也就是將所有的key映射到同一個槽中了,這樣哈希表就退化成一個鏈表,這樣的話,操作鏈表的時間復雜度則變成了O(n),這樣哈希表的性能優(yōu)勢就沒有了,所以選擇一個合適的哈希函數(shù)是最為關鍵的)
2、開放尋址
? ??使用開放尋址法是槽本身直接存放數(shù)據(jù),在插入數(shù)據(jù)時如果key所映射到的索引已經有數(shù)據(jù)了,這說明發(fā)生了沖突,這時會尋找下一個槽,如果該槽也被占用了則繼續(xù)尋找下一個槽,直到找到沒有被占用的槽,在查找時也使用同樣的策略來進行。
????由于開放尋址法處理沖突的時候占用的是其他槽的位置,這可能導致后續(xù)的key在插入的時候更加容易出現(xiàn)哈希沖突,所以采用開放尋址法的哈希表的裝載因子不能太高,否則容易出現(xiàn)性能下降。
????裝載因子是哈希表保存的元素數(shù)量和哈希表容量的比,通常采用鏈接法解決哈希沖突的哈希表的裝載因子最好不要大于1,而采用開放尋址法的哈希表最好不要大于0.5.