1.HashMap的實(shí)現(xiàn)原理
>HashMap繼承了AnstractMap抽象類,畢實(shí)現(xiàn)了Map Cloneable serializable接口
>抽象類get contain方法都是通過迭代器遍歷來實(shí)現(xiàn)莫秆。
>HashMap里的每一個無素就是個Entry,Entry里有key,有value.有next元素和一個hash屬性
>初始化時募舟,默認(rèn)設(shè)置16的Entry數(shù)組變量table用于存儲數(shù)據(jù)宛畦,有個擴(kuò)容因子0.75
>HashMap的數(shù)據(jù)存儲結(jié)構(gòu)是數(shù)據(jù)加鏈表锉试,一個Entry數(shù)組和Entry單向鏈表。JDK1.8以后使用數(shù)組+鏈表+紅黑樹實(shí)現(xiàn)呆盖。
>1.7在存儲時拖云,先根據(jù)key得到一個hash值,在通過indexFor方法與length-1得到一個數(shù)組存儲的索引值進(jìn)行元素遍歷应又,如果元素已經(jīng)存在就替換舊的數(shù)據(jù)宙项,否則創(chuàng)建一個新的節(jié)點(diǎn)株扛,并添加到數(shù)組中。
>添加新元素前會進(jìn)行一個擴(kuò)容判斷
>取數(shù)據(jù)時就通過索引+鏈表來查找
2.線程鎖的分類
>第一種Java提供了一種內(nèi)置鎖:同步代碼塊Synchronized Block和同步方法洞就,鎖可以是方法所在的對象盆繁,也可以是class作為對象。它是一個互斥鎖奖磁,最多只有一個線程持有這鎖改基,會有等待和阻塞的情況,更有可能死鎖咖为。
>這種鎖的性能是十分糟糕的,幸運(yùn)的是可以縮小同步代碼塊的作用范圍鸣哀,來確保線程的并發(fā)性以及安全性
>第二種可以使用ReentrantLock實(shí)現(xiàn)
>由于synchronized是在JVM層面實(shí)現(xiàn)的,因此系統(tǒng)可以監(jiān)控鎖的釋放與否我衬;
>而ReentrantLock是使用代碼實(shí)現(xiàn)的,系統(tǒng)無法自動釋放鎖挠羔,需要在代碼中的finally子句中顯式釋放鎖lock.unlock()。
>另外破加,在并發(fā)量比較小的情況下,使用synchronized是個不錯的選擇范舀;但是在并發(fā)量比較高的情況下,其性能下降會很嚴(yán)重锭环,此時ReentrantLock是個不錯的方案。
3.在項(xiàng)目中有遇到線程鎖需求嗎难礼?怎么優(yōu)化并發(fā)的
4.Spring的啟動原理
5.Springboot的啟動原理
6.怎么解決秒殺,支付的冪等問題
7.說說數(shù)據(jù)庫的優(yōu)化
8.說說JVM的優(yōu)化
9.Java的堆與棧 方法區(qū) 常量區(qū) 靜達(dá)區(qū)
10.講講Java的垃圾回收機(jī)制
11.NoSQL的運(yùn)用場景鹤竭,你的項(xiàng)目在哪里用到它
12.如何定位內(nèi)存溢出