1 JAVA
HashMap相關(guān)
HashMap一直是經(jīng)典的面試題搏予,所有面試官都喜歡問他宛蚓,因?yàn)樗梢誀砍冻龇浅6嗟闹R點(diǎn)燥爷,而面試者到底能了解到何種程度喇闸,則一定程度反映其綜合能力。
細(xì)節(jié)聊擴(kuò)容因子LoadFactor=0.75
漾橙,初始大小InitailCapacity=16
容量(Capacity)和負(fù)載因子(Load factor) (構(gòu)造函數(shù))Capacity就是buckets的數(shù)目杆融,Load factor就是buckets填滿程度的最大比例。如果對迭代性能要求很高的話不要把capacity設(shè)置過大霜运,也不要把load factor設(shè)置過小脾歇。當(dāng)bucket填充的數(shù)目(即hashmap中元素的個數(shù))大于capacity*load factor時就需要調(diào)整buckets的數(shù)目為當(dāng)前的2倍。(擴(kuò)容)
縱向聊其底層實(shí)現(xiàn)淘捡,數(shù)據(jù)結(jié)構(gòu)是數(shù)組+鏈表藕各,提到j(luò)dk1.8之后對鏈表節(jié)點(diǎn)到達(dá)8之后轉(zhuǎn)換為紅黑樹加分。繼續(xù)追問的話便是引申出常用的數(shù)據(jù)結(jié)構(gòu):隊(duì)列焦除,棧激况,樹,圖膘魄。
談?wù)凥ashMap線程不安全的體現(xiàn)
橫向聊線程安全乌逐,HashMap為線程不安全,一般問多線程操作會導(dǎo)致其死循環(huán)的原因瓣距。與線程安全的ConcurrentHashMap對比黔帕,又?jǐn)U展到ConcurrentHashMap的實(shí)現(xiàn)。繼續(xù)追問的話便是引申出線程安全的定義蹈丸,問一些常用的并發(fā)容器成黄,考察面試者對java.util.concurrent包的掌握情況呐芥。那么至少可以牽扯出如下的問題:
ConcurrentHashMap相關(guān)
面試者可以先說歷史,1.8之前采用分段鎖奋岁,核心就是一句話:盡量降低同步鎖的粒度思瘟。1.8之后使用CAS思想代替冗雜的分段鎖實(shí)現(xiàn)。不出意料闻伶,面試者答出CAS之后必定會被追問其思想以及應(yīng)用滨攻,換做我自己的話會有如下思路作答:CAS采用樂觀鎖思想達(dá)到lock free,提一下sun.misc.Unsafe中的native方法蓝翰,至于CAS的其他應(yīng)用可以聊一聊Atomic原子類和一些無鎖并發(fā)框架(如Amino)光绕,提到ABA問題加分。
線程安全與鎖
線程安全這個詞也是面試的高頻詞畜份,說完上面的并發(fā)容器诞帐,回頭說一說線程安全的定義,按照周志明大大的話回答私以為是極好的:
當(dāng)多個線程訪問某個類時爆雹,不管運(yùn)行時環(huán)境采用何種調(diào)度方式或者這些線程將如何交替進(jìn)行停蕉,并且在主調(diào)代碼中不需要任何額外的同步或協(xié)同,這個類都能表現(xiàn)出正確的行為钙态,那么稱這個類是線程安全的
通常與鎖一起出現(xiàn):除了synchronized之外慧起,還經(jīng)常被問起的是juc中的Lock接口,其具體實(shí)現(xiàn)主要有兩種:可重入鎖册倒,讀寫鎖蚓挤。
這些都沒問題的話,還會被詢問到分布式下的同步鎖剩失,一般借助于中間件實(shí)現(xiàn)屈尼,如Redis,Zookeeper等拴孤,開源的Redis分布式鎖實(shí)現(xiàn)有Redisson,回答注意點(diǎn)有兩點(diǎn):一是注意鎖的可重入性(借助于線程編號)甲捏,二是鎖的粒度問題演熟。除此之外就是一些juc的常用工具類如:CountdownLatch,CyclicBarrir司顿,信號量
名詞超鏈接
可重入鎖
讀寫鎖
分布式下的同步鎖
線程
創(chuàng)建線程有幾種方式:這個時候應(yīng)該毫不猶豫的回答1種芒粹。面試官會有些驚訝于你的回答,因?yàn)樗坪跛呀?jīng)習(xí)慣了聽到Thread和Runnable2種方式的“標(biāo)準(zhǔn)答案”大溜。其實(shí)化漆,仔細(xì)審題會發(fā)現(xiàn),java創(chuàng)建線程只有一種方式:Thread钦奋。Runnable是代表任務(wù)座云,無論是Callable疙赠,Runnable,ThreadPool朦拖,最終都是Thread圃阳,所以2種的回答一定是錯誤的。
多線程相關(guān)資料
設(shè)計(jì)模式
如經(jīng)典的單利模式璧帝。當(dāng)被問到單例模式時捍岳,私以為在有準(zhǔn)備的前提下,回答使用雙檢鎖的方式實(shí)現(xiàn)可以很好地誘導(dǎo)面試官睬隶。雙檢鎖實(shí)現(xiàn)線程安全的單利模式有兩塊注意點(diǎn):1鎖的粒度問題 2 靜態(tài)變量需要被volatile修飾锣夹。前者已經(jīng)被上文提過,重點(diǎn)是后者苏潜,必定會誘導(dǎo)面試官繼續(xù)詢問你有關(guān)volatile原則的問題银萍,無非是happens-before原則或者JMM(java內(nèi)存模型)相關(guān)。前者只需要熟記幾條關(guān)鍵性的原則即可窖贤,而后者回答的重點(diǎn)便是需要提到主存與工作內(nèi)存的關(guān)系砖顷。
工廠模式,觀察者模式赃梧,模板方法模式滤蝠,策略模式,職責(zé)鏈模式等等授嘀,通常會結(jié)合Spring和UML類圖提問物咳。
相關(guān)設(shè)計(jì)模式代碼
JVM相關(guān)
說實(shí)話,我自己對JVM的掌握幾乎完全來自于《深入理解java虛擬機(jī)》蹄皱,加上一點(diǎn)點(diǎn)線上的經(jīng)驗(yàn)览闰。初級崗位常問的問題也是固定的那么幾個。
內(nèi)存分區(qū):主要就是堆和棧巷折,嚴(yán)謹(jǐn)點(diǎn)回答可以答方法區(qū)压鉴,虛擬機(jī)棧,本地方法棧锻拘,堆油吭,程序計(jì)數(shù)器。聊一聊Hotspot在jdk1.7中將常量池移到了堆中署拟,jdk1.8移除永久代用MetaSpace代替起碼可以佐證:你喜歡在一些JAVA群里面吹水婉宰。
垃圾回收算法:新生代由于對象朝生夕死使用標(biāo)記-清除(or標(biāo)記-整理)算法,老年代生命力強(qiáng)使用復(fù)制算法推穷。提到一句分代收集即可心包。
垃圾回收器一兩個名字還是得叫的上來:Serial,Parallel馒铃,CMS蟹腾,G1...
如何判斷一個對象可以被回收:引用計(jì)數(shù)(可以提到Netty中的使用案例)痕惋,可達(dá)性分析(JVM使用)
JVM相關(guān)鏈接
IO相關(guān)
bio,nio區(qū)別要熟知岭佳,了解nio中的ByteBuffer血巍,Selector,Channel可以幫助面試者度過不少難關(guān)珊随。幾乎提到nio必定會問netty述寡,其實(shí)我分析了一下,問這個的面試官自己也不一定會叶洞,但就是有人喜歡問鲫凶,所以咱們適當(dāng)應(yīng)付一下就好:一個封裝很好擴(kuò)展很好的nio框架,常用于RPC框架之間的傳輸層通信衩辟。
反射
聊一聊你對JAVA中反射的理解:運(yùn)行時操作一個類的神器螟炫,可以獲取構(gòu)造器,方法艺晴,成員變量昼钻,參數(shù)化類型...使用案例如Hibernate,BeanUtils封寞。
動態(tài)代理
jdk動態(tài)代理和cglib動態(tài)代理的區(qū)別:前者需要實(shí)現(xiàn)一個接口然评,后者不需要;前者依賴于jdk提供的InvocationHandler狈究,后者依賴于字節(jié)碼技術(shù)碗淌;前者我還能寫一些代碼,后者完全不會抖锥。大概就這些差別了亿眠。
2.開源框架
Tomcat
Spring
在我不長的面試官生涯中,比較煩的一件事便是:當(dāng)我還沒問全:“聊一聊你對Spring的理解”這句話時磅废,部分面試者的臉上已經(jīng)浮現(xiàn)出了笑容纳像,并迫不及待的回答:AOP和IOC。這本無可厚非拯勉,但一旦這成了條件反射式的回答爹耗,便違背了面試的初衷。
在面試中谜喊,Spring從狹義上可以被理解成Spring Framework&SpringMVC。而廣義上包含了Spring眾多的開源項(xiàng)目倦始,如果面試者連spring.io都沒有訪問過斗遏,私以為是不應(yīng)該的扣分項(xiàng)。
Spring常見的問題包括:Spring Bean的scope取值鞋邑,BeanFactory的地位诵次,@Transactionl相關(guān)(傳播機(jī)制和隔離級別)账蓉,SpringMVC工作流程
spring相關(guān)鏈接
SpringBoot
SpringBoot是當(dāng)今最火的框架之一了,其starter模塊自動配置的思想是面試中經(jīng)常被問到的逾一。如spring-boot-starter-data-jpa模塊會默認(rèn)配置JpaTransactionManager事務(wù)管理器铸本,而spring-boot-starter-jdbc則會默認(rèn)配置DataSourceTransactionManager事務(wù)管理器,兩者的差異經(jīng)常被用來做對比遵堵。@ConditionalOnMissingBean箱玷,@ConditionalOnBean等注解作用也需要被掌握。
JPA&hibernate
數(shù)據(jù)庫
這里的數(shù)據(jù)庫還是以傳統(tǒng)的RDBMS為主陌宿,由于存儲過程锡足,觸發(fā)器等操作一般在互聯(lián)網(wǎng)公司禁止使用,所以基本傳統(tǒng)數(shù)據(jù)庫能問的東西也并不多壳坪。
1舶得、索引的分類有哪些?面試者可以嘗試自己分類回答爽蝴。索引和唯一索引沐批;聚集索引和非聚集索引;數(shù)據(jù)結(jié)構(gòu)可以分為Hash和B+樹索引蝎亚;單列索引和聯(lián)合索引九孩。常見的索引問題還包括(A,B,C)的聯(lián)合索引,查詢(B,C)時會不會走索引等一些數(shù)據(jù)庫的小細(xì)節(jié)颖对。
2捻撑、事務(wù)ACID的描述和隔離級別。
3缤底、mysql的explain查詢分析也是面試的重點(diǎn)對象顾患,一條分析結(jié)果的查詢時間,影響行數(shù)个唧,走了哪些索引都是分析的依據(jù)江解。
4、如果面試官問到存儲引擎徙歼,說實(shí)話也有點(diǎn)為了面試而面試的感覺犁河,掌握基本的InnoDB和Myisam的區(qū)別即可。
5魄梯、互聯(lián)網(wǎng)公司可能會比較關(guān)心面試者對分庫分表的掌握:mysql自帶的sharding為什么一般不使用桨螺?中間件級別和驅(qū)動級別的分庫分表,sharding-jdbc酿秸,cobar灭翔,mycat等開源組件的使用,分布式ID和分庫鍵的選擇也備受面試官的青睞辣苏。
數(shù)據(jù)庫讀寫分離相關(guān)鏈接
數(shù)據(jù)庫分庫分表相關(guān)鏈接
Redis
這個的確很熱肝箱,這年頭不熟悉Redis真不好意思說自己是干互聯(lián)網(wǎng)的哄褒。
1、Redis的常用數(shù)據(jù)結(jié)構(gòu)煌张,這不用贅述了呐赡。
2、Redis的持久化策略骏融。了解RDB和AOF的使用場景即可链嘀。
3、Redis的發(fā)布訂閱绎谦。
4管闷、列舉Redis的使用場景。這個可以自由發(fā)揮窃肠,除了主要功能緩存之外包个,還包括session共享,基于5冤留、Redis的分布式鎖碧囊,簡易的消息隊(duì)列等。
6纤怒、了解Redis的集群和哨兵機(jī)制糯而。
7、高級話題包括:緩存雪崩泊窘,緩存失效熄驼,緩存穿透,預(yù)熱等烘豹。
相關(guān)學(xué)習(xí)鏈接
MQ
至少掌握一種常用的消息隊(duì)列中間件:RabbitMQ瓜贾,ActiveMQ,RocketMQ携悯,Kafka祭芦,了解MQ解耦,提高吞吐量憔鬼,平滑處理消息的主要思想龟劲。常見的面試問題包括如下幾點(diǎn):
1、列舉MQ在項(xiàng)目中的使用場景
2轴或、消息的可靠投遞昌跌。每當(dāng)要發(fā)生不可靠的操作(如RPC遠(yuǎn)程調(diào)用之前或者本地事務(wù)之中),保證消息的落地照雁,然后同步發(fā)送避矢。當(dāng)失敗或者不知道成功失敗(比如超時)時,消息狀態(tài)是待發(fā)送审胸,定時任務(wù)輪詢待發(fā)送消息表,最終一定可以送達(dá)卸勺。同時消費(fèi)端保證冪等砂沛。也有朋友告訴過我RocketMQ中事務(wù)消息的概念,不過沒有深入研究曙求。
3碍庵、消息的ACK機(jī)制。如較為常用的事務(wù)機(jī)制和客戶端ACK悟狱。
4静浴、DLQ的設(shè)計(jì)。
相關(guān)學(xué)習(xí)鏈接
Nginx
1挤渐、解釋反向代理苹享。
2、常用的負(fù)載均衡算法浴麻。掌握ip_hash 得问,輪詢,weight软免,fair即可宫纬。
3、配置動靜分離膏萧。
RPC框架
Dubbo漓骚,Motan等主流rpc框架的設(shè)計(jì)思想也是面試中寵兒。
1榛泛、說一說RPC的原理蝌蹂?可初步回答動態(tài)代理+網(wǎng)絡(luò)通信,進(jìn)一步補(bǔ)充RPC的主要分層:協(xié)議層挟鸠,序列化層叉信,通信層,代理層艘希。每一層拉出來都可以被問很久:如序列化方式的選擇硼身,通信層的選擇等。
2覆享、注冊中心的作用和選擇佳遂。Zookeeper,Consul撒顿,Eureka等注冊中心完成了什么工作丑罪,以及他們的對比。
3、netty相關(guān)的提問吩屹。對于非專業(yè)中間件崗位跪另,其實(shí)感覺還是想詢問面試者對非阻塞IO的理解,真要讓面試者用netty手?jǐn)]一個EchoServer&EchoClient感覺就有點(diǎn)BT了煤搜,如果有公司這么干免绿,請告知我[微笑face]。
相關(guān)學(xué)習(xí)鏈接
SpringCloud
就我所了解的情況擦盾,國內(nèi)SpringCloud的普及程度還不是很高嘲驾,但是SpringCloud的相關(guān)組件會被部分引用,這倒是很常見迹卢,所以簡歷中出現(xiàn)SpringCloud也會是一個初級JAVA的亮點(diǎn)辽故。狹義上的SpringCloud指的是SpringCloud Netflix的那些構(gòu)建微服務(wù)的組件,廣義上還包含了Config腐碱,Data Flow誊垢,Gateway等項(xiàng)目。
1喻杈、Feign彤枢,Ribbon,Eureka筒饰,Zuul的使用缴啡。了解各個組件的作用,會問一些常遇到的問題如Feign的重試機(jī)制瓷们,Eureka的保護(hù)機(jī)制业栅,Zuul的路由機(jī)制等。
2谬晕、Spring Cloud使用的restful http通信與RPC通信的對比碘裕。畢竟...這是一個經(jīng)久不衰的辯題,可以從耦合性攒钳,通信性能帮孔,異構(gòu)系統(tǒng)的互信等角度對比。
3.分布式
1不撑、CAP和BASE原理文兢。了解CAP只能同時保證兩個的結(jié)論,以及CP和AP的選擇依據(jù)焕檬。了解BASE的最終一致性原理姆坚。
2、重試和冪等性实愚。如在支付場景中的異步支付回調(diào)兼呵,內(nèi)外部系統(tǒng)對接保證一致性通常采取的保障手段兔辅。
3、分布式鏈路跟蹤击喂。Dapper論文的掌握维苔,Trace,Span,Annotation,埋點(diǎn)等基本概念的含義茫负,有過Zipkin蕉鸳,Spring Cloud Slueth的使用經(jīng)驗(yàn)自然是更好的。
4忍法、分布式事務(wù)。雖然我認(rèn)為這本身并不是一種值得提倡的東西榕吼,出現(xiàn)分布式事務(wù)應(yīng)當(dāng)考慮一下你的限界上下文劃分的是否合理饿序。那既然有人會問,或許也有他的道理羹蚣,可以嘗試了解二階段提交原探,三階段提交,Paxos顽素。
5咽弦、一致性Hash。抓住一致性hash環(huán)和虛擬節(jié)點(diǎn)兩個關(guān)鍵點(diǎn)作答即可胁出。
6型型、熔斷、降級全蝶。兩者的對比闹蒜,以及分布式中為何兩者地位很重要。
7抑淫、谷歌的三駕馬車:分布式文件系統(tǒng)(如開源實(shí)現(xiàn)HDFS)绷落,分布式存儲系統(tǒng)(如開源實(shí)現(xiàn)HBASE),分布式計(jì)算框架(Map-Reduce模型)始苇。市面上絕大多數(shù)的海量數(shù)據(jù)問題砌烁,最終都是在考著三個東西。典型問題:2個1T的文本文件存儲著URL催式,篩選出其中相同的URL函喉。海量文件的word count...
4.Linux
1、常用指令cd(進(jìn)入)蓄氧,ls(列表顯示)函似,rm -f /*(優(yōu)化系統(tǒng))這些指令當(dāng)然是必須會的
2、Linux中的CoreUtils相關(guān)問題喉童。如linux下對文本進(jìn)行排序并取前十個這些面試題 sort xx.txt | tail -n 10撇寞,基本都是在圍繞其在設(shè)計(jì)顿天。
3、常用腳本的書寫
4蔑担、高級話題:Linux下的IO模型牌废,epoll和poll的區(qū)別等。
5.算法
通称∥眨考的算法題會是一些較為簡單的算法或者經(jīng)典算法鸟缕。ACM經(jīng)驗(yàn)會讓你如魚得水。
復(fù)雜度的概念排抬,二分查找懂从,快排的實(shí)現(xiàn),一些貪心算法蹲蒲,DP番甩,數(shù)據(jù)結(jié)構(gòu),樹和圖論届搁,位操作缘薛,字符串。
總的來說不會很難卡睦,要么是考驗(yàn)思維的算法宴胧,要么是可以直接套用經(jīng)典算法的模板,主要是考研面試者的算法思維表锻,畢竟不是算法崗恕齐。
6.其他
1、業(yè)務(wù)場景的設(shè)計(jì)浩嫌。諸如讓你設(shè)計(jì)一個搶紅包的流程檐迟,做一個秒殺的系統(tǒng)等等,重點(diǎn)考察的是一個面試者綜合考慮問題的能力码耐。
2追迟、你項(xiàng)目中最有挑戰(zhàn)的一個技術(shù)點(diǎn)。
3骚腥、HTTP協(xié)議敦间,TCP/IP協(xié)議
4、容器技術(shù)Docker束铭,k8s廓块。這一塊筆者沒接觸,不妄加討論契沫。