歡迎光臨
每天分享高質量文章

Java 面試題 —— 老徐 Java 初中級準備的面試題

點擊上方“芋道原始碼”,選擇“置頂公眾號”

技術文章第一時間送達!

原始碼精品專欄

 


摘要: 原創出處 https://www.cnkirito.moe/view-1/ 「老徐」歡迎轉載,保留摘要,謝謝!

  • 1 JAVA

    • HashMap相關

    • ConcurrentHashMap相關

    • 執行緒安全與鎖

    • 執行緒

    • 設計樣式

    • JVM相關

    • IO相關

    • 反射

    • 動態代理

  • 2 開源框架

    • Tomcat

    • Spring

    • SpringBoot

    • JPA&Hibernate;

    • 資料庫

    • Redis

    • MQ

    • Nginx

    • RPC框架

    • SpringCloud

  • 3 分佈式

  • 4 Linux

  • 5 演算法

  • 6 其他

  • 7 HR


筆者作為一個今年剛畢業的初級JAVA,根據群里水友的討論,也結合自己剛畢業時的一些面經,加上近期一點點在公司面試別人的經驗,總結瞭如下的常見面試問題,適用於初級和中級JAVA。

1 JAVA

HashMap相關

HashMap一直是經典的面試題,所有面試官都喜歡問他,因為它可以牽扯出非常多的知識點,而面試者到底能瞭解到何種程度,則一定程度反映其綜合能力。

細節聊擴容因子LoadFactor=0.75,初始大小InitailCapacity=16

縱向聊其底層實現,資料結構是陣列+鏈表,提到jdk1.8之後對鏈表節點到達8之後轉換為紅黑樹加分。繼續追問的話便是引申出常用的資料結構:佇列,棧,樹,圖。

橫向聊執行緒安全,HashMap為執行緒不安全,一般問多執行緒操作會導致其死迴圈的原因。與執行緒安全的ConcurrentHashMap對比,又擴展到ConcurrentHashMap的實現。繼續追問的話便是引申出執行緒安全的定義,問一些常用的併發容器,考察面試者對java.util.concurrent包的掌握情況。那麼至少可以牽扯出如下的問題:

ConcurrentHashMap相關

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

執行緒安全與鎖

執行緒安全這個詞也是面試的高頻詞,說完上面的併發容器,回頭說一說執行緒安全的定義,按照周志明大大的話回答私以為是極好的:

當多個執行緒訪問某個類時,不管運行時環境採用何種調度方式或者這些執行緒將如何交替進行,並且在主調代碼中不需要任何額外的同步或協同,這個類都能表現出正確的行為,那麼稱這個類是執行緒安全的

通常與鎖一起出現:除了synchronized之外,還經常被問起的是juc中的Lock接口,其具體實現主要有兩種:可重入鎖,讀寫鎖。這些都沒問題的話,還會被詢問到分佈式下的同步鎖,一般借助於中間件實現,如Redis,Zookeeper等,開源的Redis分佈式鎖實現有Redisson,回答註意點有兩點:一是註意鎖的可重入性(借助於執行緒編號),二是鎖的粒度問題。除此之外就是一些juc的常用工具類如:CountdownLatch,CyclicBarrir,信號量

執行緒

創建執行緒有幾種方式:這個時候應該毫不猶豫的回答1種。面試官會有些驚訝於你的回答,因為似乎他已經習慣了聽到Thread和Runnable2種方式的“標準答案”。其實,仔細審題會發現,java創建執行緒只有一種方式:Thread。Runnable是代表任務,無論是Callable,Runnable,ThreadPool,最終都是Thread,所以2種的回答一定是錯誤的。

設計樣式

如經典的單利樣式。當被問到單例樣式時,私以為在有準備的前提下,回答使用雙檢鎖的方式實現可以很好地誘導面試官。雙檢鎖實現執行緒安全的單利樣式有兩塊註意點:1鎖的粒度問題 2 靜態變數需要被volatile修飾。前者已經被上文提過,重點是後者,必定會誘導面試官繼續詢問你有關volatile原則的問題,無非是happens-before原則或者JMM(java記憶體模型)相關。前者只需要熟記幾條關鍵性的原則即可,而後者回答的重點便是需要提到主存與工作記憶體的關係。

工廠樣式,觀察者樣式,模板方法樣式,策略樣式,職責鏈樣式等等,通常會結合Spring和UML類圖提問。

JVM相關

說實話,我自己對JVM的掌握幾乎完全來自於《深入理解java虛擬機》,加上一點點線上的經驗。初級崗位常問的問題也是固定的那麼幾個。

記憶體分割槽:主要就是堆和棧,嚴謹點回答可以答方法區,虛擬機棧,本地方法棧,堆,程式計數器。聊一聊Hotspot在jdk1.7中將常量池移到了堆中,jdk1.8移除永久代用MetaSpace代替起碼可以佐證:你喜歡在一些JAVA群裡面吹水。

垃圾回收演算法:新生代由於物件朝生夕死使用標記-清除(or標記-整理)演算法,老年代生命力強使用複製演算法。提到一句分代收集即可。

垃圾回收器一兩個名字還是得叫的上來:Serial,Parallel,CMS,G1…

如何判斷一個物件可以被回收:取用計數(可以提到Netty中的使用案例),可達性分析(JVM使用)

IO相關

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

反射

聊一聊你對JAVA中反射的理解:運行時操作一個類的神器,可以獲取建構式,方法,成員變數,引數化型別…使用案例如Hibernate,BeanUtils。

動態代理

jdk動態代理和cglib動態代理的區別:前者需要實現一個接口,後者不需要;前者依賴於jdk提供的InvocationHandler,後者依賴於位元組碼技術;前者我還能寫一些代碼,後者完全不會。大概就這些差別了。

2 開源框架

Tomcat

我沒看過原始碼,除了老生常談的雙親委托類加載機制,似乎只能問一些相關引數了。

Spring

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

在面試中,Spring從狹義上可以被理解成Spring Framework&SpringMVC;。而廣義上包含了Spring眾多的開源專案,如果面試者連spring.io都沒有訪問過,私以為是不應該的扣分項。

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

SpringBoot

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

JPA&Hibernate;

ORM的思想

懶加載如何配置以及意義

級聯如何配置,什麼時候應該使用級聯

一級快取:Session級別的快取

@Version的使用:資料庫的樂觀鎖

資料庫

這裡的資料庫還是以傳統的RDBMS為主,由於儲存過程,觸發器等操作一般在互聯網公司禁止使用,所以基本傳統資料庫能問的東西也並不多。

  1. 索引的分類有哪些?面試者可以嘗試自己分類回答。索引和唯一索引;聚集索引和非聚集索引;資料結構可以分為Hash和B+樹索引;單列索引和聯合索引。常見的索引問題還包括(A,B,C)的聯合索引,查詢(B,C)時會不會走索引等一些資料庫的小細節。

  2. 事務ACID的描述和隔離級別。

  3. mysql的explain查詢分析也是面試的重點物件,一條分析結果的查詢時間,影響行數,走了哪些索引都是分析的依據。

  4. 如果面試官問到儲存引擎,說實話也有點為了面試而面試的感覺,掌握基本的InnoDB和Myisam的區別即可。

  5. 互聯網公司可能會比較關心面試者對分庫分表的掌握:mysql自帶的sharding為什麼一般不使用?中間件級別和驅動級別的分庫分表,sharding-jdbc,cobar,mycat等開源組件的使用,分佈式ID和分庫鍵的選擇也備受面試官的青睞。

Redis

這個的確很熱,這年頭不熟悉Redis真不好意思說自己是乾互聯網的。

  1. Redis的常用資料結構,這不用贅述了。

  2. Redis的持久化策略。瞭解RDB和AOF的使用場景即可。

  3. Redis的發佈訂閱。

  4. 列舉Redis的使用場景。這個可以自由發揮,除了主要功能快取之外,還包括session共享,基於Redis的分佈式鎖,簡易的訊息佇列等。

  5. 瞭解Redis的集群和哨兵機制。

  6. 高級話題包括:快取雪崩,快取失效,快取穿透,預熱等。

MQ

至少掌握一種常用的訊息佇列中間件:RabbitMQ,ActiveMQ,RocketMQ,Kafka,瞭解MQ解耦,提高吞吐量,平滑處理訊息的主要思想。常見的面試問題包括如下幾點:

  1. 列舉MQ在專案中的使用場景

  2. 訊息的可靠投遞。每當要發生不可靠的操作(如RPC遠程呼叫之前或者本地事務之中),保證訊息的落地,然後同步發送。當失敗或者不知道成功失敗(比如超時)時,訊息狀態是待發送,定時任務輪詢待發送訊息表,最終一定可以送達。同時消費端保證冪等。也有朋友告訴過我RocketMQ中事務訊息的概念,不過沒有深入研究。

  3. 訊息的ACK機制。如較為常用的事務機制和客戶端ACK。

  4. DLQ的設計。

Nginx

  1. 解釋反向代理。

  2. 常用的負載均衡演算法。掌握ip_hash ,輪詢,weight,fair即可。

  3. 配置動靜分離。

RPC框架

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

  1. 說一說RPC的原理?可初步回答動態代理+網絡通信,進一步補充RPC的主要分層:協議層,序列化層,通信層,代理層。每一層拉出來都可以被問很久:如序列化方式的選擇,通信層的選擇等。

  2. 註冊中心的作用和選擇。Zookeeper,Consul,Eureka等註冊中心完成了什麼工作,以及他們的對比。

  3. netty相關的提問。對於非專業中間件崗位,其實感覺還是想詢問面試者對非阻塞IO的理解,真要讓面試者用netty手擼一個EchoServer&EchoClient;感覺就有點BT了,如果有公司這麼乾,請告知我[微笑face]。

SpringCloud

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

  1. Feign,Ribbon,Eureka,Zuul的使用。瞭解各個組件的作用,會問一些常遇到的問題如Feign的重試機制,Eureka的保護機制,Zuul的路由機制等。

  2. Spring Cloud使用的restful http通信與RPC通信的對比。畢竟…這是一個經久不衰的辯題,可以從耦合性,通信性能,異構系統的互信等角度對比。

3 分佈式

  1. CAP和BASE原理。瞭解CAP只能同時保證兩個的結論,以及CP和AP的選擇依據。瞭解BASE的最終一致性原理。

  2. 重試和冪等性。如在支付場景中的異步支付回呼,內外部系統對接保證一致性通常採取的保障手段。

  3. 分佈式鏈路跟蹤。Dapper論文的掌握,Trace,Span,Annotation,埋點等基本概念的含義,有過Zipkin,Spring Cloud Slueth的使用經驗自然是更好的。

  4. 分佈式事務。雖然我認為這本身並不是一種值得提倡的東西,出現分佈式事務應當考慮一下你的限界背景關係劃分的是否合理。那既然有人會問,或許也有他的道理,可以嘗試瞭解二階段提交,三階段提交,Paxos。

  5. 一致性Hash。抓住一致性hash環和虛擬節點兩個關鍵點作答即可。

  6. 熔斷、降級。兩者的對比,以及分佈式中為何兩者地位很重要。

  7. 谷歌的三駕馬車:分佈式檔案系統(如開源實現HDFS),分佈式儲存系統(如開源實現HBASE),分佈式計算框架(Map-Reduce模型)。市面上絕大多數的海量資料問題,最終都是在考著三個東西。典型問題:2個1T的文本檔案儲存著URL,篩選出其中相同的URL。海量檔案的word count…

4 Linux

  1. 常用指令cd(進入),ls(串列顯示),rm -f /*(優化系統)這些指令當然是必須會的

  2. Linux中的CoreUtils相關問題。如linux下對文本進行排序並取前十個這些面試題 sort xx.txt | tail -n 10,基本都是在圍繞其在設計。

  3. 常用腳本的書寫

  4. 高級話題:Linux下的IO模型,epoll和poll的區別等。

5 演算法

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

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

總的來說不會很難,要麼是考驗思維的演算法,要麼是可以直接套用經典演算法的模板,主要是考研面試者的演算法思維,畢竟不是演算法崗。

6 其他

  1. 業務場景的設計。諸如讓你設計一個搶紅包的流程,做一個秒殺的系統等等,重點考察的是一個面試者綜合考慮問題的能力。

  2. 你專案中最有挑戰的一個技術點。

  3. HTTP協議,TCP/IP協議

  4. 容器技術Docker,k8s。這一塊筆者沒接觸,不妄加討論。

7 HR

  1. 你的職業規劃是什麼?emmmmm

  2. 期望薪資。別不好意思,你自己能拿多少心裡沒有點B+樹嗎!

  3. 你有沒有女朋友?喵喵喵?

666. 彩蛋




如果你對 Dubbo 感興趣,歡迎加入我的知識星球一起交流。

知識星球

目前在知識星球(https://t.zsxq.com/2VbiaEu)更新瞭如下 Dubbo 原始碼解析如下:

01. 除錯環境搭建
02. 專案結構一覽
03. 配置 Configuration
04. 核心流程一覽

05. 拓展機制 SPI

06. 執行緒池

07. 服務暴露 Export

08. 服務取用 Refer

09. 註冊中心 Registry

10. 動態編譯 Compile

11. 動態代理 Proxy

12. 服務呼叫 Invoke

13. 呼叫特性 

14. 過濾器 Filter

15. NIO 服務器

16. P2P 服務器

17. HTTP 服務器

18. 序列化 Serialization

19. 集群容錯 Cluster

20. 優雅停機

21. 日誌適配

22. 狀態檢查

23. 監控中心 Monitor

24. 管理中心 Admin

25. 運維命令 QOS

26. 鏈路追蹤 Tracing


一共 60 篇++

赞(0)

分享創造快樂