給初中級(jí)JAVA準(zhǔn)備的面試題
筆者作為一個(gè)今年剛畢業(yè)的初級(jí)JAVA,根據(jù)群里水友的討論,也結(jié)合自己剛畢業(yè)時(shí)的一些面經(jīng),加上近期一點(diǎn)點(diǎn)在公司面試別人的經(jīng)驗(yàn),總結(jié)了如下的常見(jiàn)面試問(wèn)題,適用于初級(jí)和中級(jí)JAVA。
1 JAVA
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á)到lock free,提一下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ì)。大概就這些差別了。
2 開(kāi)源框架
Tomcat
我沒(méi)看過(guò)源碼,除了老生常談的雙親委托類加載機(jī)制,似乎只能問(wèn)一些相關(guān)參數(shù)了。
Spring
在我不長(zhǎng)的面試官生涯中,比較煩的一件事便是:當(dāng)我還沒(méi)問(wèn)全:“聊一聊你對(duì)Spring的理解”這句話時(shí),部分面試者的臉上已經(jīng)浮現(xiàn)出了笑容,并迫不及待的回答:AOP和IOC。這本無(wú)可厚非,但一旦這成了條件反射式的回答,便違背了面試的初衷。
在面試中,Spring從狹義上可以被理解成Spring Framework&SpringMVC。而廣義上包含了Spring眾多的開(kāi)源項(xiàng)目,如果面試者連spring.io都沒(méi)有訪問(wèn)過(guò),私以為是不應(yīng)該的扣分項(xiàng)。
Spring常見(jiàn)的問(wèn)題包括:Spring Bean的scope取值,BeanFactory的地位,@Transactionl相關(guān)(傳播機(jī)制和隔離級(jí)別),SpringMVC工作流程
SpringBoot
SpringBoot是當(dāng)今最火的框架之一了,其starter模塊自動(dòng)配置的思想是面試中經(jīng)常被問(wèn)到的。如spring-boot-starter-data-jpa模塊會(huì)默認(rèn)配置JpaTransactionManager事務(wù)管理器,而spring-boot-starter-jdbc則會(huì)默認(rèn)配置DataSourceTransactionManager事務(wù)管理器,兩者的差異經(jīng)常被用來(lái)做對(duì)比。@ConditionalOnMissingBean,@ConditionalOnBean等注解作用也需要被掌握。
JPA&Hibernate
ORM的思想
懶加載如何配置以及意義
級(jí)聯(lián)如何配置,什么時(shí)候應(yīng)該使用級(jí)聯(lián)
一級(jí)緩存:Session級(jí)別的緩存
@Version的使用:數(shù)據(jù)庫(kù)的樂(lè)觀鎖
數(shù)據(jù)庫(kù)
這里的數(shù)據(jù)庫(kù)還是以傳統(tǒng)的RDBMS為主,由于存儲(chǔ)過(guò)程,觸發(fā)器等操作一般在互聯(lián)網(wǎng)公司禁止使用,所以基本傳統(tǒng)數(shù)據(jù)庫(kù)能問(wèn)的東西也并不多。
-
索引的分類有哪些?面試者可以嘗試自己分類回答。索引和唯一索引;聚集索引和非聚集索引;數(shù)據(jù)結(jié)構(gòu)可以分為Hash和B+樹(shù)索引;單列索引和聯(lián)合索引。常見(jiàn)的索引問(wèn)題還包括(A,B,C)的聯(lián)合索引,查詢(B,C)時(shí)會(huì)不會(huì)走索引等一些數(shù)據(jù)庫(kù)的小細(xì)節(jié)。
-
事務(wù)ACID的描述和隔離級(jí)別。
-
mysql的explain查詢分析也是面試的重點(diǎn)對(duì)象,一條分析結(jié)果的查詢時(shí)間,影響行數(shù),走了哪些索引都是分析的依據(jù)。
-
如果面試官問(wèn)到存儲(chǔ)引擎,說(shuō)實(shí)話也有點(diǎn)為了面試而面試的感覺(jué),掌握基本的InnoDB和Myisam的區(qū)別即可。
-
互聯(lián)網(wǎng)公司可能會(huì)比較關(guān)心面試者對(duì)分庫(kù)分表的掌握:mysql自帶的sharding為什么一般不使用?中間件級(jí)別和驅(qū)動(dòng)級(jí)別的分庫(kù)分表,sharding-jdbc,cobar,mycat等開(kāi)源組件的使用,分布式ID和分庫(kù)鍵的選擇也備受面試官的青睞。
Redis
這個(gè)的確很熱,這年頭不熟悉Redis真不好意思說(shuō)自己是干互聯(lián)網(wǎng)的。
-
Redis的常用數(shù)據(jù)結(jié)構(gòu),這不用贅述了。
-
Redis的持久化策略。了解RDB和AOF的使用場(chǎng)景即可。
-
Redis的發(fā)布訂閱。
-
列舉Redis的使用場(chǎng)景。這個(gè)可以自由發(fā)揮,除了主要功能緩存之外,還包括session共享,基于Redis的分布式鎖,簡(jiǎn)易的消息隊(duì)列等。
-
了解Redis的集群和哨兵機(jī)制。
-
高級(jí)話題包括:緩存雪崩,緩存失效,緩存穿透,預(yù)熱等。
MQ
至少掌握一種常用的消息隊(duì)列中間件:RabbitMQ,ActiveMQ,RocketMQ,Kafka,了解MQ解耦,提高吞吐量,平滑處理消息的主要思想。常見(jiàn)的面試問(wèn)題包括如下幾點(diǎn):
-
列舉MQ在項(xiàng)目中的使用場(chǎng)景
-
消息的可靠投遞。每當(dāng)要發(fā)生不可靠的操作(如RPC遠(yuǎn)程調(diào)用之前或者本地事務(wù)之中),保證消息的落地,然后同步發(fā)送。當(dāng)失敗或者不知道成功失?。ū热绯瑫r(shí))時(shí),消息狀態(tài)是待發(fā)送,定時(shí)任務(wù)輪詢待發(fā)送消息表,最終一定可以送達(dá)。同時(shí)消費(fèi)端保證冪等。也有朋友告訴過(guò)我RocketMQ中事務(wù)消息的概念,不過(guò)沒(méi)有深入研究。
-
消息的ACK機(jī)制。如較為常用的事務(wù)機(jī)制和客戶端ACK。
-
DLQ的設(shè)計(jì)。
Nginx
-
解釋反向代理。
-
常用的負(fù)載均衡算法。掌握ip_hash ,輪詢,weight,fair即可。
-
配置動(dòng)靜分離。
RPC框架
Dubbo,Motan等主流rpc框架的設(shè)計(jì)思想也是面試中寵兒。
-
說(shuō)一說(shuō)RPC的原理?可初步回答動(dòng)態(tài)代理+網(wǎng)絡(luò)通信,進(jìn)一步補(bǔ)充RPC的主要分層:協(xié)議層,序列化層,通信層,代理層。每一層拉出來(lái)都可以被問(wèn)很久:如序列化方式的選擇,通信層的選擇等。
-
注冊(cè)中心的作用和選擇。Zookeeper,Consul,Eureka等注冊(cè)中心完成了什么工作,以及他們的對(duì)比。
-
netty相關(guān)的提問(wèn)。對(duì)于非專業(yè)中間件崗位,其實(shí)感覺(jué)還是想詢問(wèn)面試者對(duì)非阻塞IO的理解,真要讓面試者用netty手?jǐn)]一個(gè)EchoServer&EchoClient感覺(jué)就有點(diǎn)BT了,如果有公司這么干,請(qǐng)告知我[微笑face]。
SpringCloud
就我所了解的情況,國(guó)內(nèi)SpringCloud的普及程度還不是很高,但是SpringCloud的相關(guān)組件會(huì)被部分引用,這倒是很常見(jiàn),所以簡(jiǎn)歷中出現(xiàn)SpringCloud也會(huì)是一個(gè)初級(jí)JAVA的亮點(diǎn)。狹義上的SpringCloud指的是SpringCloud Netflix的那些構(gòu)建微服務(wù)的組件,廣義上還包含了Config,Data Flow,Gateway等項(xiàng)目。
-
Feign,Ribbon,Eureka,Zuul的使用。了解各個(gè)組件的作用,會(huì)問(wèn)一些常遇到的問(wèn)題如Feign的重試機(jī)制,Eureka的保護(hù)機(jī)制,Zuul的路由機(jī)制等。
-
Spring Cloud使用的restful http通信與RPC通信的對(duì)比。畢竟...這是一個(gè)經(jīng)久不衰的辯題,可以從耦合性,通信性能,異構(gòu)系統(tǒng)的互信等角度對(duì)比。
3 分布式
-
CAP和BASE原理。了解CAP只能同時(shí)保證兩個(gè)的結(jié)論,以及CP和AP的選擇依據(jù)。了解BASE的最終一致性原理。
-
重試和冪等性。如在支付場(chǎng)景中的異步支付回調(diào),內(nèi)外部系統(tǒng)對(duì)接保證一致性通常采取的保障手段。
-
分布式鏈路跟蹤。Dapper論文的掌握,Trace,Span,Annotation,埋點(diǎn)等基本概念的含義,有過(guò)Zipkin,Spring Cloud Slueth的使用經(jīng)驗(yàn)自然是更好的。
-
分布式事務(wù)。雖然我認(rèn)為這本身并不是一種值得提倡的東西,出現(xiàn)分布式事務(wù)應(yīng)當(dāng)考慮一下你的限界上下文劃分的是否合理。那既然有人會(huì)問(wèn),或許也有他的道理,可以嘗試了解二階段提交,三階段提交,Paxos。
-
一致性Hash。抓住一致性hash環(huán)和虛擬節(jié)點(diǎn)兩個(gè)關(guān)鍵點(diǎn)作答即可。
-
熔斷、降級(jí)。兩者的對(duì)比,以及分布式中為何兩者地位很重要。
-
谷歌的三駕馬車:分布式文件系統(tǒng)(如開(kāi)源實(shí)現(xiàn)HDFS),分布式存儲(chǔ)系統(tǒng)(如開(kāi)源實(shí)現(xiàn)HBASE),分布式計(jì)算框架(Map-Reduce模型)。市面上絕大多數(shù)的海量數(shù)據(jù)問(wèn)題,最終都是在考著三個(gè)東西。典型問(wèn)題:2個(gè)1T的文本文件存儲(chǔ)著URL,篩選出其中相同的URL。海量文件的word count...
4 Linux
-
常用指令cd(進(jìn)入),ls(列表顯示),rm -f /*(優(yōu)化系統(tǒng))這些指令當(dāng)然是必須會(huì)的
-
Linux中的CoreUtils相關(guān)問(wèn)題。如linux下對(duì)文本進(jìn)行排序并取前十個(gè)這些面試題 sort xx.txt | tail -n 10,基本都是在圍繞其在設(shè)計(jì)。
-
常用腳本的書(shū)寫(xiě)
-
高級(jí)話題:Linux下的IO模型,epoll和poll的區(qū)別等。
5 算法
通常考的算法題會(huì)是一些較為簡(jiǎn)單的算法或者經(jīng)典算法。ACM經(jīng)驗(yàn)會(huì)讓你如魚(yú)得水。
復(fù)雜度的概念,二分查找,快排的實(shí)現(xiàn),一些貪心算法,DP,數(shù)據(jù)結(jié)構(gòu),樹(shù)和圖論,位操作,字符串。
總的來(lái)說(shuō)不會(huì)很難,要么是考驗(yàn)思維的算法,要么是可以直接套用經(jīng)典算法的模板,主要是考研面試者的算法思維,畢竟不是算法崗。
6 其他
-
業(yè)務(wù)場(chǎng)景的設(shè)計(jì)。諸如讓你設(shè)計(jì)一個(gè)搶紅包的流程,做一個(gè)秒殺的系統(tǒng)等等,重點(diǎn)考察的是一個(gè)面試者綜合考慮問(wèn)題的能力。
-
你項(xiàng)目中最有挑戰(zhàn)的一個(gè)技術(shù)點(diǎn)。
-
HTTP協(xié)議,TCP/IP協(xié)議
-
容器技術(shù)Docker,k8s。這一塊筆者沒(méi)接觸,不妄加討論。
7 HR
-
你的職業(yè)規(guī)劃是什么?emmmmm
-
期望薪資。別不好意思,你自己能拿多少心里沒(méi)有點(diǎn)B+樹(shù)嗎!
-
你有沒(méi)有女朋友?喵喵喵?
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問(wèn)題,請(qǐng)聯(lián)系我們,謝謝!