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