更新時間:2019-12-19 15:07:31 來源:動力節(jié)點 瀏覽3115次
有哪些集合實現(xiàn),對應(yīng)的線程安全集合?
主要考察集合框架的兩大類:集合(collection)和圖(map),集合下面主要了解list和set,如ArrayList、LinkedList、HashSet、TreeSet;map下主要了解HashMap、TreeMap。
劃重點(加分項):
① 線程安全集合選兩個代表性的:ConcurrentHashMap和CopyOnWriteArrayList,了解它們是如何做到線程安全的。
hashmap底層結(jié)構(gòu),為什么使用鏈表?(hashmap是面試必考題)
HashMap的底層結(jié)構(gòu)(數(shù)組)實現(xiàn),一定要了解透徹,如put()、get()兩塊源碼花點心思;
hash碰撞后產(chǎn)生的鏈表、紅黑樹順帶了解,有能力的最好看下源碼實現(xiàn)(加分項)。
4、阻塞隊列的實現(xiàn)原理?
lock鎖的多條件(condition)阻塞控制,基礎(chǔ)薄弱的需要提前了解一下同步鎖synchronized、lock及Condition類,這一塊考驗高級和中級研發(fā)人員的界限,需要挖一下源碼,多用心。
加分項:另外輻射出來可能會順帶直接問你AQS,建議仔細了解其實現(xiàn)原理,如其內(nèi)部如何利用雙向鏈表的,重點看acquire()方法實現(xiàn)。
JVM篇
內(nèi)存模型(必考題)
無論你關(guān)注jdk1.8之前還是之后,不重要,關(guān)鍵是能正常理解每一塊的作用、是否線程共享/私有。
堆、虛擬機棧、本地方法棧、程序計數(shù)器、方法區(qū),需要了解每一部分的作用。
劃重點:
虛擬機棧包含哪些部分、程序計數(shù)器的作用這兩塊著重了解。
GC發(fā)生在哪一塊,GC算法?
發(fā)生在堆內(nèi)存,GC算法主要了解:標(biāo)記清除、復(fù)制、標(biāo)記整理,需要知道其執(zhí)行步驟及各自的區(qū)別。
劃重點:
年輕代劃分成哪幾部分(E、S0、S1),使用哪種算法(復(fù)制),老年代使用哪種算法(標(biāo)記清除),為什么?這里需要耐心理解透徹,很容易輻射到此類問題。
MySql篇
1、事務(wù)隔離級別,默認哪一個,解釋幻讀、不可重復(fù)讀及二者區(qū)別?
隔離級別:讀未提交、讀提交、不可重復(fù)讀、串行化,默認是不可重復(fù)讀,具體幻讀問題,請參考筆者此前文章幻讀、不可重復(fù)讀,其中進行了詳細說明。
索引失效場景、索引數(shù)據(jù)結(jié)構(gòu)?
主要分為非組合索引和組合索引:
1、非組合索引主要注意or、like(若like非左模糊情形,如xxx%,則可以使用索引),索引列存在表達式、聚合函數(shù)等等;
2、組合索引主要注意是否遵循最左原則。
還有些其它小點靠大家自己去積累,筆者這會是蒙圈狀態(tài),沒反應(yīng)過來。
索引數(shù)據(jù)結(jié)構(gòu):主要關(guān)注B+樹,花心思了解透,且需要了解聚簇索引和非聚簇索引。
加分項:InnoDB與MyisAM索引方面的區(qū)別。
3、數(shù)據(jù)庫引擎
主要可以說說InnoDB、MyISAM這兩個常用的即可,需要了解二者的區(qū)別,InnoDB支持事務(wù),二者使用場景,二者之間如何轉(zhuǎn)變。
4、mysql分表中間件、如何監(jiān)聽binlog
中間件:tddl,MyCat(其實考驗?zāi)愕闹R儲備廣度,一般不要求細說中間件的實現(xiàn))。
監(jiān)聽時可以使用duckula中間件或者binlog監(jiān)聽獨立jar包(common-binlog-alone)。
5、筆者認為高級或資深人員必須要了解的知識儲備:InnoDB的MVCC機制
mysql自身的并發(fā)控制如何實現(xiàn)的,原理主要從其新增、更新、刪除三方面去了解其內(nèi)部的操作過程,其版本號如何控制等等。
考察實際問題解決能力
1、對于分表之后的業(yè)務(wù)常用數(shù)據(jù),比如訂單分表后,要查某段時間內(nèi)的訂單數(shù)據(jù),如何實現(xiàn)?
本題不能直接將一張張分表查詢一遍,效率太低,偏離實際使用場景的時效性和性能,所以考慮引入中間件(比如ES),可以將業(yè)務(wù)熱度較高的數(shù)據(jù)抽取出來按照用戶常用查詢維度進行組合存放,當(dāng)實際請求過來時,直接通過es即可獲取相應(yīng)結(jié)果。
注:這種方式也適用于DB的減壓,若問到DB如何減壓也可以這么回答。
比如下單之后有很多相應(yīng)的數(shù)據(jù)都要同步修改,但是這類數(shù)據(jù)都不在同一個應(yīng)用服務(wù)和數(shù)據(jù)庫中,有什么方式可以達到數(shù)據(jù)的最終一致性?
這一題筆者給出兩種思路(筆者傾向于后一種方式):
①使用消息,不同數(shù)據(jù)對應(yīng)其所在的服務(wù)進行消息監(jiān)聽,進而獲取消息后進一步修改,當(dāng)然不能排除消息丟失的情況,所以需要進一步完善;
②可以監(jiān)聽binlog,當(dāng)下單數(shù)據(jù)變更后,直接通過監(jiān)聽到的binlog的數(shù)據(jù)變更結(jié)果之后,根據(jù)具體需要進行對應(yīng)的后續(xù)處理。
cup飆升如何排查?
具體說下思路:
① 先要ps -ef | grep java獲得java進程,然后使用top命令獲取cpu使用較高的線程;
② 使用jstack -l pid > /tmp/xxxx.log將堆棧情況輸出到文件中便于后續(xù)查看;
③將top中cpu使用率較高的線程id轉(zhuǎn)換成16進制去上一步的文件中查找,大多數(shù)情況下可以定位出一些眉目;
④如果仍然沒有頭緒,接著使用jmap導(dǎo)出堆的dump文件,并使用Eclipse的插件進行查看,比如找到問題對象進行實際代碼分析。
現(xiàn)場編程
1、將單鏈表逆序輸出,不能改變單鏈表的結(jié)構(gòu)(比如不允許將單鏈表改造成雙向鏈表)
這一題筆者給出兩個思路:
① 簡單點考慮可以借助棧來實現(xiàn),順序壓棧后直接棧頂順輸出即可;
② 當(dāng)然,如果要求不允許借助棧來實現(xiàn),那就需要遞歸的思想,設(shè)置兩個指針變量a和b(a->b),分別指向表頭前兩個節(jié)點,使得a指向的節(jié)點為b指向的節(jié)點的后繼,再利用一個臨時變量,逐步后移a、b直到b為空即可。
2、電影院選座位,共n個座位,每個座位票價不一樣,找出連續(xù)的m個座位,使其票價總和最小。
這一題筆者直接理解為那個元素的數(shù)組(元素都是數(shù)值),找出m個連續(xù)的數(shù)字使其總和最小,給出起始點的下標(biāo)即可。
可以直接順序查找,每次計算出的m個元素的總和值保存在臨時變量中,例如若使用map,則key為下標(biāo),value為sum值,記住不要過多浪費空間,并不需要每個下標(biāo)都存放進去,只要存放一個即可,然后依次遍歷數(shù)組下標(biāo),比較sum值(較小的放進map,同時為了保證節(jié)省空間,放進map前進行清空map,使map始終只有一個元素),最終能獲取到最小的sum,拿出map的為一個鍵值對,即獲取到起始下標(biāo)。
一般現(xiàn)場編程題不會太難,畢竟不是讓你現(xiàn)場ACM,而是著重考察面試者是否保留了過硬的動手能力,而不是只會CURD,但是算法還是需要日常積累才能自如應(yīng)付。
以上就是動力節(jié)點Java培訓(xùn)機構(gòu)小編介紹的“2020年高級資深的Java面試題集”的內(nèi)容,希望對大家有幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。
相關(guān)推薦
最新最全java面試題及答案(初級到高級)
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743