1. Object都有哪些方法
wait竹习、notify、notifyAll列牺、toString整陌、hashCode、equels瞎领、getClass泌辫、clone、finalize
2. 兩個(gè)對象equels相等九默,hashCode是否相等震放,為什么?
- equels相等驼修,hashcode一定相等殿遂。
- JavaDoc描述了在重寫equels方法的時(shí)候一定要重寫hashcode,且必須遵循自反性乙各、對稱性墨礁、傳播性、唯一性耳峦。
- 在hashmap中恩静,同時(shí)用了equels和hashcode做了判斷,如果我們在重寫equels的時(shí)候沒有讓hashcode相等的話妇萄,對象保存到hashmap中就會(huì)有問題
3. JAVA集合
4. HashMap原理
HashMap采用散列表的存儲(chǔ)結(jié)構(gòu)蜕企。主干是Entry數(shù)組咬荷,每個(gè)數(shù)組元素又是一個(gè)鏈表結(jié)構(gòu)。JDK1.8對結(jié)構(gòu)進(jìn)行了優(yōu)化轻掩,當(dāng)鏈表元素大于8的時(shí)候幸乒,會(huì)變成紅黑樹結(jié)構(gòu);又當(dāng)鏈表元素小于6的時(shí)候唇牧,重新變回鏈表罕扎。
- HashMap會(huì)根據(jù)當(dāng)前Entry數(shù)組使用情況進(jìn)行自動(dòng)擴(kuò)容,默認(rèn)擴(kuò)容因子為0.75
- 擴(kuò)容為當(dāng)前的兩倍大小丐重,擴(kuò)容之后要對所有元素進(jìn)行rehash操作
- Hash算法為 hash = key & (length - 1)
- 解決hash沖突的方法為鏈地址法
- 當(dāng)hash沖突時(shí)腔召,元素插入的方式,JDK1.7為頭插法扮惦,JDK1.8為尾插法臀蛛。避免在rehash的過程形成鏈環(huán)
5. ConcurrentHashMap原理
- JDK1.7采用segment數(shù)組+entry數(shù)組+鏈表結(jié)構(gòu)
- JDK1.8采用entry數(shù)組+鏈表+紅黑樹結(jié)構(gòu)
- 在put和get的時(shí)候使用了Synchronized關(guān)鍵字保證線程安全