HashMap相關(guān)
HashMap一直是經(jīng)典的面試題,所有面試官都喜歡問(wèn)他,因?yàn)樗梢誀砍冻龇浅6嗟闹R(shí)點(diǎn),而面試者到底能了解到何種程度,則一定程度反映其綜合能力。
細(xì)節(jié)聊擴(kuò)容因子LoadFactor=0.75,初始大小InitailCapacity=16
縱向聊其底層實(shí)現(xiàn),數(shù)據(jù)結(jié)構(gòu)是數(shù)組+鏈表,提到j(luò)dk1.8之后對(duì)鏈表節(jié)點(diǎn)到達(dá)8之后轉(zhuǎn)換為紅黑樹(shù)加分。繼續(xù)追問(wèn)的話便是引申出常用的數(shù)據(jù)結(jié)構(gòu):隊(duì)列,棧,樹(shù),圖。
橫向聊線程安全,HashMap為線程不安全,一般問(wèn)多線程操作會(huì)導(dǎo)致其死循環(huán)的原因。與線程安全的ConcurrentHashMap對(duì)比,又?jǐn)U展到ConcurrentHashMap的實(shí)現(xiàn)。繼續(xù)追問(wèn)的話便是引申出線程安全的定義,問(wèn)一些常用的并發(fā)容器,考察面試者對(duì)java.util.concurrent包的掌握情況。那么至少可以牽扯出如下的問(wèn)題:
ConcurrentHashMap相關(guān)
面試者可以先說(shuō)歷史,1.8之前采用分段鎖,核心就是一句話:盡量降低同步鎖的粒度。1.8之后使用CAS思想代替冗雜的分段鎖實(shí)現(xiàn)。不出意料,面試者答出CAS之后必定會(huì)被追問(wèn)其思想以及應(yīng)用,換做我自己的話會(huì)有如下思路作答:CAS采用樂(lè)觀鎖思想達(dá)到lockfree,提一下sun.misc.Unsafe中的native方法,至于CAS的其他應(yīng)用可以聊一聊Atomic原子類和一些無(wú)鎖并發(fā)框架(如Amino),提到ABA問(wèn)題加分。
線程安全與鎖
線程安全這個(gè)詞也是面試的高頻詞,說(shuō)完上面的并發(fā)容器,回頭說(shuō)一說(shuō)線程安全的定義,按照周志明大大的話回答私以為是極好的:
當(dāng)多個(gè)線程訪問(wèn)某個(gè)類時(shí),不管運(yùn)行時(shí)環(huán)境采用何種調(diào)度方式或者這些線程將如何交替進(jìn)行,并且在主調(diào)代碼中不需要任何額外的同步或協(xié)同,這個(gè)類都能表現(xiàn)出正確的行為,那么稱這個(gè)類是線程安全的
通常與鎖一起出現(xiàn):除了synchronized之外,還經(jīng)常被問(wèn)起的是juc中的Lock接口,其具體實(shí)現(xiàn)主要有兩種:可重入鎖,讀寫(xiě)鎖。這些都沒(méi)問(wèn)題的話,還會(huì)被詢問(wèn)到分布式下的同步鎖,一般借助于中間件實(shí)現(xiàn),如Redis,Zookeeper等,開(kāi)源的Redis分布式鎖實(shí)現(xiàn)有Redisson,回答注意點(diǎn)有兩點(diǎn):一是注意鎖的可重入性(借助于線程編號(hào)),二是鎖的粒度問(wèn)題。除此之外就是一些juc的常用工具類如:CountdownLatch,CyclicBarrir,信號(hào)量
線程
創(chuàng)建線程有幾種方式:這個(gè)時(shí)候應(yīng)該毫不猶豫的回答1種。面試官會(huì)有些驚訝于你的回答,因?yàn)樗坪跛呀?jīng)習(xí)慣了聽(tīng)到Thread和Runnable2種方式的“標(biāo)準(zhǔn)答案”。其實(shí),仔細(xì)審題會(huì)發(fā)現(xiàn),java創(chuàng)建線程只有一種方式:Thread。Runnable是代表任務(wù),無(wú)論是Callable,Runnable,ThreadPool,最終都是Thread,所以2種的回答一定是錯(cuò)誤的。
設(shè)計(jì)模式
如經(jīng)典的單例模式。當(dāng)被問(wèn)到單例模式時(shí),私以為在有準(zhǔn)備的前提下,回答使用雙檢鎖的方式實(shí)現(xiàn)可以很好地誘導(dǎo)面試官。雙檢鎖實(shí)現(xiàn)線程安全的單例模式有兩塊注意點(diǎn):1鎖的粒度問(wèn)題2靜態(tài)變量需要被volatile修飾。前者已經(jīng)被上文提過(guò),重點(diǎn)是后者,必定會(huì)誘導(dǎo)面試官繼續(xù)詢問(wèn)你有關(guān)volatile原則的問(wèn)題,無(wú)非是happens-before原則或者JMM(java內(nèi)存模型)相關(guān)。前者只需要熟記幾條關(guān)鍵性的原則即可,而后者回答的重點(diǎn)便是需要提到主存與工作內(nèi)存的關(guān)系。
工廠模式,觀察者模式,模板方法模式,策略模式,職責(zé)鏈模式等等,通常會(huì)結(jié)合Spring和UML類圖提問(wèn)。
JVM相關(guān)
說(shuō)實(shí)話,我自己對(duì)JVM的掌握幾乎完全來(lái)自于《深入理解java虛擬機(jī)》,加上一點(diǎn)點(diǎn)線上的經(jīng)驗(yàn)。初級(jí)崗位常問(wèn)的問(wèn)題也是固定的那么幾個(gè)。
內(nèi)存分區(qū):主要就是堆和棧,嚴(yán)謹(jǐn)點(diǎn)回答可以答方法區(qū),虛擬機(jī)棧,本地方法棧,堆,程序計(jì)數(shù)器。聊一聊Hotspot在jdk1.7中將常量池移到了堆中,jdk1.8移除永久代用metaSpace代替起碼可以佐證:你喜歡在一些JAVA群里面吹水。
垃圾回收算法:新生代由于對(duì)象朝生夕死使用標(biāo)記-清除(or標(biāo)記-整理)算法,老年代生命力強(qiáng)使用復(fù)制算法。提到一句分代收集即可。
垃圾回收器一兩個(gè)名字還是得叫的上來(lái):Serial,Parallel,CMS,G1...
如何判斷一個(gè)對(duì)象可以被回收:引用計(jì)數(shù)(可以提到Netty中的使用案例),可達(dá)性分析(JVM使用)
IO相關(guān)
bio,nio區(qū)別要熟知,了解nio中的ByteBuffer,Selector,Channel可以幫助面試者度過(guò)不少難關(guān)。幾乎提到nio必定會(huì)問(wèn)netty,其實(shí)我分析了一下,問(wèn)這個(gè)的面試官自己也不一定會(huì),但就是有人喜歡問(wèn),所以咱們適當(dāng)應(yīng)付一下就好:一個(gè)封裝很好擴(kuò)展很好的nio框架,常用于RPC框架之間的傳輸層通信。
反射
聊一聊你對(duì)JAVA中反射的理解:運(yùn)行時(shí)操作一個(gè)類的神器,可以獲取構(gòu)造器,方法,成員變量,參數(shù)化類型...使用案例如Hibernate,BeanUtils。
動(dòng)態(tài)代理
jdk動(dòng)態(tài)代理和cglib動(dòng)態(tài)代理的區(qū)別:前者需要實(shí)現(xiàn)一個(gè)接口,后者不需要;前者依賴于jdk提供的InvocationHandler,后者依賴于字節(jié)碼技術(shù);前者我還能寫(xiě)一些代碼,后者完全不會(huì)。大概就這些差別了。
以上就是長(zhǎng)沙一度軟件培訓(xùn)Java培訓(xùn)機(jī)構(gòu)小編介紹的“經(jīng)典初級(jí)Java工程師面試題”的內(nèi)容,希望對(duì)大家有幫助,如有疑問(wèn),請(qǐng)?jiān)诰€咨詢,有專業(yè)老師隨時(shí)為你服務(wù)。