金三銀四跳槽季,這些面試題你都會了嗎?


又是一季 “金三銀四” ,你面試了嗎?

Q1:String、StringBuffer、StringBuilder 有什么區別?

Tips:首先要整理出 String 的基本特性,Immutable、不可變等特性,其次是后兩者與前者的區別,最后是 StringBuffer 與 StringBuilder 之間的區別,從安全和並發的角度去談

Answer:String 是 Java 中基礎類型之一,它提供了我們關於字符串構建和處理的大部分邏輯,本質上在內部就是一個 final 修飾的字符數組,一旦初始化就不在允許修改,所以我們平常的手動字符串拼接其實都是生成了一個新的字符串對象,這個叫字符串的不可變性。StringBuilder 相比於 String,內部的字符數組不再修飾為 final,這也就方便了各種 append 操作,通過動態擴容內部字符數組避免每一次拼接都產生新的 String 對象(動態擴容每次會擴容一倍,至少保證一定時間內不需要重新分配內存),StringBuffer 相對於 StringBuilder,內部所有方法都加上了 synchronized 保證並發安全性,當然犧牲的就是性能。

可能追問:String 為什么設計成不可變的?

1、jvm 中有常量池的概念,比如 String a = "abc",那么 abc 編譯的時候會進入常量池,a 引用指向常量池,當我在別的地方定義 String b = "abc",你會發現 a 和 b 指向同一塊內存,如果字符串可變,那么 a 變化后,b 就會發現自己的值變化了,這是不合理的

2、多線程操作字符串,每次都是創建新的字符串,不存在並發安全問題

Q2:強引用、軟引用、弱引用、虛引用有什么區別?具體使用場景是什么?

Tips:這道面試題,屬於既偏門又非常高頻的一道題目。說它偏門,是因為在大多數應用開發中,很少直接操作各種不同引用,雖然我們使用的類庫、框架可能利用了其機制。它被頻繁問到,是因為這是一個綜合性的題目,既考察了我們對基礎概念的理解,也考察了對底層對象生命周期、垃圾收集機制等的掌握。

Answer:不同的引用類型,主要體現的是對象不同的可達性(reachable)狀態和對垃圾收集的影響。這些引用共同的父類是 ReferenceQueue

強引用:我們日常程序中使用的最多的引用,這種引用永遠不會被 GC 回收,比如存在一個強引用 a 指向一個數組,那么只要 a 不被賦值 null,也就是不丟失這個強引用,此數組永遠不會被回收內存

軟引用:當系統發生 GC 時,如果內存仍然不夠新對象的分配,會收集掉這部分的引用對象

弱引用:當系統發生 GC 時,不論整理后的內存是否充足,依然會回收掉這部分引用對象

虛引用:虛引用指向的對象,甚至無法再次獲取到該引用對象,往往和一個隊列共同使用,在引用的對象被回收的時候,GC 會添加該對象到隊列中,相當於是告知系統此對象是何時回收掉的

Q3:談談 Java 反射機制,動態代理是基於什么原理?

Tips:反射是一個比較底層的機制,涉及到 jvm 內存區,動態代理是需要使用到反射的,兩種不同的代理方式之間的區別與聯系

Answer:jvm 堆內存中有一塊“方法區”,用於存放類的定義元數據,以及類的一些靜態字段的值,反射本質上就是根據類的全路徑名從方法區讀出類的基本定義,動態代理分兩種,jdk 自帶動態代理實現和 cglib 動態代理:

jdk 動態代理只能為接口做代理,原因是運行時會生成一個類,這個類繼承 Proxy,並在構造時傳入一個 InvocationHandler 實例保存在父類 Proxy protected字段中用於完成代理邏輯;jdk 這個代理的確定很明顯,不能為類做代理只能為接口做代理,

cglib 其實也類似,有一個 MethodInterceptor 用於自定義代理邏輯,只不過 cglib 生成的代理類直接繼承被代理類,並基於 fastclass 而不是反射提升調用性能

fastclass 其實就是對類中方法索引化,每一個方法對應一個索引,調用的時候不需要反射,直接根據索引知道調用哪個方法

305b3cf0-5326-48d4-af3d-56175499bce7-8511614.png


關注公眾不迷路,一個愛分享的程序員。

公眾號回復「1024」加作者微信一起探討學習!

每篇文章用到的所有案例代碼素材都會上傳我個人 github

https://github.com/SingleYam/overview_java

歡迎來踩!

YangAM 公眾號

更多面試題以及作者的作答,關注公眾號,后台回復關鍵詞 “面試題”,免費領取!如果對你有用,記得點贊關注贊賞哦~

有不同的理解,也歡迎你加作者微信,一起探討交流,后台回復 “1024” 獲取作者微信二維碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM