集合相關(guān)面試題
- HashMap的擴容機智
新建了一個HashMap的底層數(shù)組颈畸,長度為原來的兩倍,而后調(diào)用transfer方法嚣艇,將舊HashMap的全部元素添加到新的HashMap中承冰,擴容是一個相當(dāng)耗時的操作华弓,因為它需要重新計算這些元素在新的數(shù)組中的位置并進(jìn)行復(fù)制處理食零。因此,我們在用HashMap時寂屏,最好能提前預(yù)估下HashMap中元素的個數(shù)贰谣,這樣有助于提高HashMap的性能。
- HashMap可以存入Key為Null的鍵么
可以迁霎,如果存入為null的鍵吱抚,永遠(yuǎn)都放在table[0]的頭節(jié)點的鏈表中。
- HashMap中put值的時候如果發(fā)生了沖突考廉,是怎么處理的秘豹?
JDK使用了鏈地址法,hash表的每個元素又分別鏈接著一個單鏈表昌粤,元素為頭結(jié)點既绕,如果不同的key映射到了相同的下標(biāo),那么就使用頭插法涮坐,插入到該元素對應(yīng)的鏈表凄贩。
- HashMap與HashTable的區(qū)別
- 繼承關(guān)系上:HashTable是繼承的Dictionary類,HashMap是實現(xiàn)的Map接口袱讹,所以HashTable老一點
- 線程安全方面:HashMap是線程不安全的疲扎,所以在速度方面比HashTable要快,JDK5之后引入ConcurrentHashMap,可以在多線程中使用椒丧,還可以使用
Map m = Collections.synchronizeMap(hashMap);讓HashMap同步- 存值方面
HashMap可以存入Key為null的鍵
- ArrayList和Vector的區(qū)別
- ArrayList線程不安全壹甥,效率更高
- ArrayList容量不足是增加50%,Vector翻倍
- Vector可以設(shè)置增長因子,而ArrayList不可以