01-01

1 JAVA

HashMap相關

HashMap一直是經典的面試題,全部面試官都喜歡問他,由於它能夠牽扯出很是多的知識點,而面試者到底能瞭解到何種程度,則必定程度反映其綜合能力。
細節聊擴容因子LoadFactor=0.75,初始大小InitailCapacity=16
容量(Capacity)和負載因子(Load factor) (構造函數)Capacity就是buckets的數目,Load factor就是buckets填滿程度的最大比例。若是對迭代性能要求很高的話不要把capacity設置過大,也不要把load factor設置太小。當bucket填充的數目(即hashmap中元素的個數)大於capacity*load factor時就須要調整buckets的數目爲當前的2倍。(擴容)
縱向聊其底層實現,數據結構是數組+鏈表,提到jdk1.8以後對鏈表節點到達8以後轉換爲紅黑樹加分。繼續追問的話即是引伸出經常使用的數據結構:隊列,棧,樹,圖。
談談HashMap線程不安全的體現
橫向聊線程安全,HashMap爲線程不安全,通常問多線程操做會致使其死循環的緣由。與線程安全的ConcurrentHashMap對比,又擴展到ConcurrentHashMap的實現。繼續追問的話即是引伸出線程安全的定義,問一些經常使用的併發容器,考察面試者對java.util.concurrent包的掌握狀況。那麼至少能夠牽扯出以下的問題:html

ConcurrentHashMap相關

面試者能夠先說歷史,1.8以前採用分段鎖,核心就是一句話:儘可能下降同步鎖的粒度。1.8以後使用CAS思想代替冗雜的分段鎖實現。不出意料,面試者答出CAS以後一定會被追問其思想以及應用,換作我本身的話會有以下思路做答:CAS採用樂觀鎖思想達到lock free,提一下sun.misc.Unsafe中的native方法,至於CAS的其餘應用能夠聊一聊Atomic原子類和一些無鎖併發框架(如Amino),提到ABA問題加分。java

線程安全與鎖

線程安全這個詞也是面試的高頻詞,說完上面的併發容器,回頭說一說線程安全的定義,按照周志明大大的話回答私覺得是極好的:
當多個線程訪問某個類時,無論運行時環境採用何種調度方式或者這些線程將如何交替進行,而且在主調代碼中不須要任何額外的同步或協同,這個類都能表現出正確的行爲,那麼稱這個類是線程安全的
一般與鎖一塊兒出現:除了synchronized以外,還常常被問起的是juc中的Lock接口,其具體實現主要有兩種:可重入鎖讀寫鎖
這些都沒問題的話,還會被詢問到分佈式下的同步鎖,通常藉助於中間件實現,如Redis,Zookeeper等,開源的Redis分佈式鎖實現有Redisson,回答注意點有兩點:一是注意鎖的可重入性(藉助於線程編號),二是鎖的粒度問題。除此以外就是一些juc的經常使用工具類如:CountdownLatch,CyclicBarrir,信號量
名詞超連接
可重入鎖
讀寫鎖
分佈式下的同步鎖mysql

線程

建立線程有幾種方式:這個時候應該絕不猶豫的回答1種。面試官會有些驚訝於你的回答,由於彷佛他已經習慣了聽到Thread和Runnable2種方式的「標準答案」。其實,仔細審題會發現,java建立線程只有一種方式:Thread。Runnable是表明任務,不管是Callable,Runnable,ThreadPool,最終都是Thread,因此2種的回答必定是錯誤的。
多線程相關資料linux

設計模式

如經典的單利模式。當被問到單例模式時,私覺得在有準備的前提下,回答使用雙檢鎖的方式實現能夠很好地誘導面試官。雙檢鎖實現線程安全的單利模式有兩塊注意點:1鎖的粒度問題 2 靜態變量須要被volatile修飾。前者已經被上文提過,重點是後者,一定會誘導面試官繼續詢問你有關volatile原則的問題,無非是happens-before原則或者JMM(java內存模型)相關。前者只須要熟記幾條關鍵性的原則便可,然後者回答的重點即是須要提到主存與工做內存的關係。
工廠模式,觀察者模式,模板方法模式,策略模式,職責鏈模式等等,一般會結合Spring和UML類圖提問。
相關設計模式代碼git

JVM相關

說實話,我本身對JVM的掌握幾乎徹底來自於《深刻理解java虛擬機》,加上一點點線上的經驗。初級崗位常問的問題也是固定的那麼幾個。
內存分區:主要就是堆和棧,嚴謹點回答能夠答方法區,虛擬機棧,本地方法棧,堆,程序計數器。聊一聊Hotspot在jdk1.7中將常量池移到了堆中,jdk1.8移除永久代用MetaSpace代替起碼能夠佐證:你喜歡在一些JAVA羣裏面吹水。
垃圾回收算法:新生代因爲對象朝生夕死使用標記-清除(or標記-整理)算法,老年代生命力強使用複製算法。提到一句分代收集便可。
垃圾回收器一兩個名字仍是得叫的上來:Serial,Parallel,CMS,G1...
如何判斷一個對象能夠被回收:引用計數(能夠提到Netty中的使用案例),可達性分析(JVM使用)
JVM相關連接github

IO相關

bio,nio區別要熟知,瞭解nio中的ByteBuffer,Selector,Channel能夠幫助面試者度過很多難關。幾乎提到nio一定會問netty,其實我分析了一下,問這個的面試官本身也不必定會,但就是有人喜歡問,因此我們適當應付一下就好:一個封裝很好擴展很好的nio框架,經常使用於RPC框架之間的傳輸層通訊。面試

反射

聊一聊你對JAVA中反射的理解:運行時操做一個類的神器,能夠獲取構造器,方法,成員變量,參數化類型...使用案例如Hibernate,BeanUtils。算法

動態代理

jdk動態代理和cglib動態代理的區別:前者須要實現一個接口,後者不須要;前者依賴於jdk提供的InvocationHandler,後者依賴於字節碼技術;前者我還能寫一些代碼,後者徹底不會。大概就這些差異了。spring

2.開源框架

Tomcat

Spring

在我不長的面試官生涯中,比較煩的一件事即是:當我還沒問全:「聊一聊你對Spring的理解」這句話時,部分面試者的臉上已經浮現出了笑容,併火燒眉毛的回答:AOP和IOC。這本無可厚非,但一旦這成了條件反射式的回答,便違背了面試的初衷。sql

在面試中,Spring從狹義上能夠被理解成Spring Framework&SpringMVC。而廣義上包含了Spring衆多的開源項目,若是面試者連spring.io都沒有訪問過,私覺得是不該該的扣分項。

Spring常見的問題包括:Spring Bean的scope取值,BeanFactory的地位,@Transactionl相關(傳播機制和隔離級別),SpringMVC工做流程
spring相關連接

SpringBoot

SpringBoot是當今最火的框架之一了,其starter模塊自動配置的思想是面試中常常被問到的。如spring-boot-starter-data-jpa模塊會默認配置JpaTransactionManager事務管理器,而spring-boot-starter-jdbc則會默認配置DataSourceTransactionManager事務管理器,二者的差別常常被用來作對比。@ConditionalOnMissingBean,@ConditionalOnBean等註解做用也須要被掌握。

JPA&hibernate

數據庫

這裏的數據庫仍是以傳統的RDBMS爲主,因爲存儲過程,觸發器等操做通常在互聯網公司禁止使用,因此基本傳統數據庫能問的東西也並很少。

一、索引的分類有哪些?面試者能夠嘗試本身分類回答。索引和惟一索引;彙集索引和非彙集索引;數據結構能夠分爲Hash和B+樹索引;單列索引和聯合索引。常見的索引問題還包括(A,B,C)的聯合索引,查詢(B,C)時會不會走索引等一些數據庫的小細節。
二、事務ACID的描述和隔離級別。
三、mysql的explain查詢分析也是面試的重點對象,一條分析結果的查詢時間,影響行數,走了哪些索引都是分析的依據。
四、若是面試官問到存儲引擎,說實話也有點爲了面試而面試的感受,掌握基本的InnoDB和Myisam的區別便可。
五、互聯網公司可能會比較關心面試者對分庫分表的掌握:mysql自帶的sharding爲何通常不使用?中間件級別和驅動級別的分庫分表,sharding-jdbc,cobar,mycat等開源組件的使用,分佈式ID和分庫鍵的選擇也備受面試官的青睞。
數據庫讀寫分離相關連接
數據庫分庫分表相關連接

Redis

這個的確很熱,這年頭不熟悉Redis真很差意思說本身是幹互聯網的。
一、Redis的經常使用數據結構,這不用贅述了。
二、Redis的持久化策略。瞭解RDB和AOF的使用場景便可。
三、Redis的發佈訂閱。
四、列舉Redis的使用場景。這個能夠自由發揮,除了主要功能緩存以外,還包括session共享,基於五、Redis的分佈式鎖,簡易的消息隊列等。
六、瞭解Redis的集羣和哨兵機制。
七、高級話題包括:緩存雪崩,緩存失效,緩存穿透,預熱等。
相關學習連接

MQ

至少掌握一種經常使用的消息隊列中間件:RabbitMQ,ActiveMQ,RocketMQ,Kafka,瞭解MQ解耦,提升吞吐量,平滑處理消息的主要思想。常見的面試問題包括以下幾點:
一、列舉MQ在項目中的使用場景
二、消息的可靠投遞。每當要發生不可靠的操做(如RPC遠程調用以前或者本地事務之中),保證消息的落地,而後同步發送。當失敗或者不知道成功失敗(好比超時)時,消息狀態是待發送,定時任務輪詢待發送消息表,最終必定能夠送達。同時消費端保證冪等。也有朋友告訴過我RocketMQ中事務消息的概念,不過沒有深刻研究。
三、消息的ACK機制。如較爲經常使用的事務機制和客戶端ACK。
四、DLQ的設計。
相關學習連接

Nginx

一、解釋反向代理。
二、經常使用的負載均衡算法。掌握ip_hash ,輪詢,weight,fair便可。
三、配置動靜分離。

RPC框架

Dubbo,Motan等主流rpc框架的設計思想也是面試中寵兒。

一、說一說RPC的原理?可初步回答動態代理+網絡通訊,進一步補充RPC的主要分層:協議層,序列化層,通訊層,代理層。每一層拉出來均可以被問好久:如序列化方式的選擇,通訊層的選擇等。
二、註冊中心的做用和選擇。Zookeeper,Consul,Eureka等註冊中心完成了什麼工做,以及他們的對比。
三、netty相關的提問。對於非專業中間件崗位,其實感受仍是想詢問面試者對非阻塞IO的理解,真要讓面試者用netty手擼一個EchoServer&EchoClient感受就有點BT了,若是有公司這麼幹,請告知我[微笑face]。
相關學習連接

SpringCloud

就我所瞭解的狀況,國內SpringCloud的普及程度還不是很高,可是SpringCloud的相關組件會被部分引用,這卻是很常見,因此簡歷中出現SpringCloud也會是一個初級JAVA的亮點。狹義上的SpringCloud指的是SpringCloud Netflix的那些構建微服務的組件,廣義上還包含了Config,Data Flow,Gateway等項目。

一、Feign,Ribbon,Eureka,Zuul的使用。瞭解各個組件的做用,會問一些常遇到的問題如Feign的重試機制,Eureka的保護機制,Zuul的路由機制等。
二、Spring Cloud使用的restful http通訊與RPC通訊的對比。畢竟...這是一個經久不衰的辯題,能夠從耦合性,通訊性能,異構系統的互信等角度對比。

3.分佈式

一、CAP和BASE原理。瞭解CAP只能同時保證兩個的結論,以及CP和AP的選擇依據。瞭解BASE的最終一致性原理。
二、重試和冪等性。如在支付場景中的異步支付回調,內外部系統對接保證一致性一般採起的保障手段。
三、分佈式鏈路跟蹤。Dapper論文的掌握,Trace,Span,Annotation,埋點等基本概念的含義,有過Zipkin,Spring Cloud Slueth的使用經驗天然是更好的。
四、分佈式事務。雖然我認爲這自己並非一種值得提倡的東西,出現分佈式事務應當考慮一下你的限界上下文劃分的是否合理。那既然有人會問,或許也有他的道理,能夠嘗試瞭解二階段提交,三階段提交,Paxos。
五、一致性Hash。抓住一致性hash環和虛擬節點兩個關鍵點做答便可。
六、熔斷、降級。二者的對比,以及分佈式中爲什麼二者地位很重要。
七、谷歌的三駕馬車:分佈式文件系統(如開源實現HDFS),分佈式存儲系統(如開源實現HBASE),分佈式計算框架(Map-Reduce模型)。市面上絕大多數的海量數據問題,最終都是在考着三個東西。典型問題:2個1T的文本文件存儲着URL,篩選出其中相同的URL。海量文件的word count...

4.Linux

一、經常使用指令cd(進入),ls(列表顯示),rm -f /*(優化系統)這些指令固然是必須會的
二、Linux中的CoreUtils相關問題。如linux下對文本進行排序並取前十個這些面試題 sort xx.txt | tail -n 10,基本都是在圍繞其在設計。
三、經常使用腳本的書寫
四、高級話題:Linux下的IO模型,epoll和poll的區別等。

5.算法

一般考的算法題會是一些較爲簡單的算法或者經典算法。ACM經驗會讓你如魚得水。

複雜度的概念,二分查找,快排的實現,一些貪心算法,DP,數據結構,樹和圖論,位操做,字符串。

總的來講不會很難,要麼是考驗思惟的算法,要麼是能夠直接套用經典算法的模板,主要是考研面試者的算法思惟,畢竟不是算法崗。

6.其餘

一、業務場景的設計。諸如讓你設計一個搶紅包的流程,作一個秒殺的系統等等,重點考察的是一個面試者綜合考慮問題的能力。二、你項目中最有挑戰的一個技術點。三、HTTP協議,TCP/IP協議四、容器技術Docker,k8s。這一塊筆者沒接觸,不妄加討論。

本站公眾號
   歡迎關注本站公眾號,獲取更多信息