更新時間:2023-01-10 13:47:49 來源:動力節(jié)點 瀏覽2417次
2023年已經(jīng)開始了,接近我們的是大家常說的金三銀四,時間晃眼就過去,不少同學(xué)開始為新的工作早早做出準備,不管是臨陣磨槍還是勢在必得,想必看文章的你也正期待著升值漲薪吧,大家不妨來看看小編為大家盤點整理出的java反射面試題。
1、實現(xiàn)單例設(shè)計模式(懶漢、餓漢)
//懶漢,顧名思義比較懶,在用的時候才實例化
public class Singleton {
//創(chuàng)建實例,注意,此時沒有new
private static Singleton instance = null;
//構(gòu)造方法私有化
private Singleton() {}
//公有的靜態(tài)方法,返回實例對象
public static Singleton getInstance() {
if (instance == null) {
//這里才new
instance = new Singleton();
}
return instance;
}
}
//餓漢,顧名思義很饑餓,創(chuàng)建對象的時候就直接new
public class Singleton {
//創(chuàng)建實例的時候就new
private static Singleton instance = new Singleton();
// 私有化構(gòu)造方法,外部不能new
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
2、簡述Java的反射機制和使用場景
反射是Java的一種機制,可以讓我們在運行時獲取類的信息
通過反射我們可以獲取到類的所有信息,比如它的屬性、構(gòu)造器、方法、注解等
適用于需要動態(tài)創(chuàng)建對象的場景
關(guān)于反射能說的太多,已單獨出一篇博客來記錄,請出門右轉(zhuǎn)至信不信十分鐘讓你徹底搞懂java反射
3、什么是內(nèi)存泄漏,怎么確定內(nèi)存泄漏?
概念:內(nèi)存泄漏就是指jvm內(nèi)存沒有及時釋放,用人話說就是使用完的對象沒有被回收,一般造成原因都是編碼不規(guī)范,new了很多值為null的對象,然后又不調(diào)用
怎么確認:linux有個工具叫valgrind,一兩句話說不清楚,單獨拎出來講,移步使用valgrind來檢查內(nèi)存泄漏
4、簡述動態(tài)代理和靜態(tài)代理
靜態(tài)代理:
動態(tài)代理:
5、Java中接口和抽象類的異同?
先單獨說一點,讓你可以在朋友面前裝逼:接口也能被繼承,只不過是被接口繼承
1、都能包含抽象的方法,這些抽象的方法用于描述類具備的功能,不提供具體的實現(xiàn)(jdk1.8允許接口有一個default的實現(xiàn)方法)
2、接口是對事物行為的抽象,而抽象類是對事務(wù)本質(zhì)的抽象;
3、接口中的變量必須給出初始值,抽象類可以不給;
4、一個類只能繼承一個抽象類,但可以實現(xiàn)多個接口;
5、抽象類中可以寫非抽象的方法,從而避免在子類中重復(fù)書寫它們,這樣可以提高代碼的復(fù)用性,這是抽象類的優(yōu)勢;接口中只能有抽象的方法;
針對第二點和第四點舉個例幫助理解:
對于抽象類:比方說有公雞、母雞、公狗、母狗,我們可以抽象出兩個更高級的類,雞類和狗類,因為你不能又是雞又是狗,所以你只能繼承其中一個,這就是為什么抽象類只能單繼承;
對于接口:眾所周知,雞都會唱、跳、rap,這時候就可以把雞的基本操作抽象成一個接口,而有的雞通過后天練習(xí)可能會學(xué)會打籃球,那么就存在一種高端雞,又會唱跳rap又會打籃球,這就是為什么接口可以多實現(xiàn);
6、Java中sleep和wait的區(qū)別?
1、sleep是Thread的方法,wait是Object的方法
2、sleep方法沒有釋放鎖,而wait方法釋放了鎖
3、wait,notify和notifyAll只能在同步控制方法或者同步控制塊里面使用,而sleep可以在任何地方使用
4、sleep必須捕獲異常,而wait,notify和notifyAll不需要捕獲異常
7、Java如何進行高效的數(shù)組拷貝?
Arrays.copyOf或 System.arraycopy,是自己new數(shù)組, 然后for循環(huán)復(fù)制效率的兩倍左右
為什么快,因為它們是native方法;
8、http中g(shù)et和post的區(qū)別?
GET在瀏覽器回退時是無害的,而POST會再次提交請求。
GET產(chǎn)生的URL地址可以被Bookmark,而POST不可以。
GET請求會被瀏覽器主動cache,而POST不會,除非手動設(shè)置。
GET請求只能進行url編碼,而POST支持多種編碼方式。
GET請求參數(shù)會被完整保留在瀏覽器歷史記錄里,而POST中的參數(shù)不會被保留。
GET請求在URL中傳送的參數(shù)是有長度限制的,而POST么有。
對參數(shù)的數(shù)據(jù)類型,GET只接受ASCII字符,而POST沒有限制。
GET比POST更不安全,因為參數(shù)直接暴露在URL上,所以不能用來傳遞敏感信息。
GET參數(shù)通過URL傳遞,POST放在Request body中。
然而實際上,它們的本質(zhì)都是 TCP 連接,并無區(qū)別。上面的答案純粹是為了應(yīng)付面試官。真正導(dǎo)致產(chǎn)生區(qū)別的原因是 HTTP 的規(guī)定以及瀏覽器/服務(wù)器的限制,這才導(dǎo)致它們在應(yīng)用過程中可能會有所不同。
以上就是“90%會被面試官問到的Java反射面試題”,你能回答上來嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動力節(jié)點Java官網(wǎng)。
相關(guān)閱讀