經過多次總結後給初中級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,後者依賴於字節碼技術;前者我還能寫一些代碼,後者完全不會。大概就這些差別了。

經過多次總結後給初中級Java工程師準備的一些面試題(面試整理)

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。這一塊筆者沒接觸,不妄加討論。
經過多次總結後給初中級Java工程師準備的一些面試題(面試整理)

7 HR

  1. 你的職業規劃是什麼?emmmmm
  2. 期望薪資。別不好意思,你自己能拿多少心裡沒有點B+樹嗎!
  3. 你有沒有女朋友?喵喵喵?

我們該如何提升自己,該怎樣規劃未來幾年的進階方向?

參加工作0-1年之間,java程序員必須要做得事兒

當你學會了Java的基礎知識以後,你還不足以參加工作,你還需要繼續深造。你必需要學會java開發框架。公司裡為了提高開發的效率,會使用一些Java Web框架。目前比較主流的是SSM框架,即spring、springmvc、mybatis。你需要學會這三個框架的搭建,並用它們做出一個簡單的增刪改查的Web項目。你可以不理解那些配置都是什麼含義,以及為什麼要這麼做,這些留著後面你去了解。但你一定要可以快速的利用它們三個搭建出一個Web框架,你可以記錄下你第一次搭建的過程,在搭建的過程中,也可以順便了解一下maven的知識。在你目前這個階段,你只需要在網絡上了解一下maven基本的使用方法即可,一些高端的用法隨著你工作經驗的增加,會逐漸接觸到的。

Spring、Spring MVC源碼

經過多次總結後給初中級Java工程師準備的一些面試題(面試整理)

Spring5


經過多次總結後給初中級Java工程師準備的一些面試題(面試整理)

SpringMVC

MyBatis源碼


經過多次總結後給初中級Java工程師準備的一些面試題(面試整理)

MyBatis

參加工作1-2年之間,Java程序員必須要做得事兒

這部分時間段的同學,已經對Java有了一個更加深入的瞭解。

這一年,你必須對於設計模式瞭如指掌,此外,設計模式並不是你這一年唯一的任務,你還需要看一些關於代碼編寫優化的書。總而言之,這個階段,你的核心任務就是提高你的代碼能力,要能寫出一手優雅的代碼。

另外,在過去2年的工作當中,你肯定或多或少接觸過併發。這個時候,你應該去更加深入的瞭解併發相關的知識,與此同時,這個階段你要做的事情還遠不止如此。這個時候,你應該對於你所使用的框架應該有了更深入的瞭解,對於Java的類庫也有了更深入的瞭解。因此,你需要去看一些JDK中的類的源碼,也包括你所使用的框架的源碼。總而言之,這個階段,你需要做的是深入瞭解Java底層和Java類庫,也就是JVM和JDK的相關內容。而且還要更深入的去了解你所使用的框架,方式比較推薦看源碼或者看官方文檔。

設計模式


經過多次總結後給初中級Java工程師準備的一些面試題(面試整理)

設計模式

併發編程

經過多次總結後給初中級Java工程師準備的一些面試題(面試整理)

併發編程

參加工作3-4年之間,Java程序員必須要做得事兒

這個階段的同學,提升已經是很難了,而且這個階段的學習往往會比較多樣化。因為在前3年的過程中,你肯定或多或少接觸過一些其它的技術,比如大數據、分佈式緩存、分佈式消息服務、分佈式計算、軟負載均衡等等。這些技術,你能精通任何一項,都將是你未來面試時巨大的優勢,因此如果你對某一項技術感興趣的話,這個時候可以深入去研究一下。這項技術不一定是你工作所用到的,但一定是相關的。

  • 分佈式架構思維
  • 分佈式協調分流
  • 異步與消息中間件
  • 緩存和NoSQL
  • 高可用數據存儲
  • 分佈式場景解決方案
經過多次總結後給初中級Java工程師準備的一些面試題(面試整理)

分佈式架構

參加工作4-5年之間,Java程序員必須要做得事兒

參加工作4年到5年的同學,相信你在自己所鑽研的領域已經有了自己一定的見解,這個時候,技術上你應該已經遇到瓶頸了。這個時候不要著急提高自己的技術,已經是時候提高你的影響力了,你可以嘗試去一些知名的公司去提高你的背景,你可以發表一些文章去影響更多的人。當然,你也可以去Github創建一個屬於你的開源項目,去打造自己的產品。技術學到這個階段,很容易遇到瓶頸,而且往往達到一定程度後,你再深入下去的收效就真的微乎其微了,除非你是專門搞學術研究的。然而很可惜,大部分程序猿做不到這一步,那是科學家做的事情。這個時候提高影響力不僅僅是因為技術上容易遇到瓶頸,更多的是影響力可以給你創造更多的機會。所以,在這個階段,你最大的任務是提高自己的影響力,為自己未來的十年工作生涯那一天做準備。

開源項目

經過多次總結後給初中級Java工程師準備的一些面試題(面試整理)

B2C商城項目實戰


以上就是初中級面試整理以及未來幾年規劃和學習掌握的知識點,如果你有考慮規劃方案,想努力改變自己,歡迎加Qqun:908676731,一起學習,相互討論。群裡也有收集一些進階資料和進階腦圖以及面試的一些真題等等(還有關於Dubbo、Redis、Netty、zookeeper、Spring cloud、分佈式、高併發等架構視頻資料),還會有大牛分析程序員該如何規劃自己的職業生涯,先到先得,早點佔坑群滿就進不去了。


分享到:


相關文章: