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