更新時間:2020-03-23 10:34:59 來源:動力節點 瀏覽2136次
HashMap相關
HashMap一直是經典的面試題,所有面試官都喜歡問他,因為它可以牽扯出非常多的知識點,而面試者到底能了解到何種程度,則一定程度反映其綜合能力。
細節聊擴容因子LoadFactor=0.75,初始大小InitailCapacity=16
縱向聊其底層實現,數據結構是數組+鏈表,提到jdk1.8之后對鏈表節點到達8之后轉換為紅黑樹加分。繼續追問的話便是引申出常用的數據結構:隊列,棧,樹,圖。
橫向聊線程安全,HashMap為線程不安全,一般問多線程操作會導致其死循環的原因。與線程安全的ConcurrentHashMap對比,又擴展到ConcurrentHashMap的實現。繼續追問的話便是引申出線程安全的定義,問一些常用的并發容器,考察面試者對java.util.concurrent包的掌握情況。那么至少可以牽扯出如下的問題:
ConcurrentHashMap相關
面試者可以先說歷史,1.8之前采用分段鎖,核心就是一句話:盡量降低同步鎖的粒度。1.8之后使用CAS思想代替冗雜的分段鎖實現。不出意料,面試者答出CAS之后必定會被追問其思想以及應用,換做我自己的話會有如下思路作答:CAS采用樂觀鎖思想達到lockfree,提一下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培訓機構小編介紹的“經典初級Java工程師面試題”的內容,希望對大家有幫助,如有疑問,請在線咨詢,有專業老師隨時為你服務。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習