Java面試例題解析<二>


Java面試例題解析<二>


2.語言特性考察

通過上篇基本概念的考察,如果能夠應對如上,那麼面試官對你的程序設計基本功底應該是比較認可的。接下來就會加大難度,考察你對Java語言特性的掌握深度,以下考題別看耳熟能詳,卻很能見功底,面試者完全可以侃侃而談一番,但如果說了半天還是沒能準確道出實質的話,那麼,就會給面試官留下知識的探索不夠深入的印象。

此類考題重點包括:Java語言的三個特性,繼承、封裝、多態;反射機制;類的初始化過程。

面試例題4

Java有哪三大語言特性? 你能說下對多態的理解嗎?

解析:面試官首先會問Java的三大語言特性是啥,通常情況下,這個問題90%多的人肯定都能答上來,所以考察的重點在於面試者答上來以後,再讓說說對這三個特性的理解或者某一個特性的理解。通常情況下,對多態的考察更為常見,當然,面試者也要做好回答另兩大特性的準備。

Java的三大語言特性是繼承、封裝和多態。多態可以簡單地概括為“一個接口,多種方法”。在程序運行的過程中才決定調用哪個函數。通常,繼承可以擴展已存在的代碼模塊(類),它們的目的都是為了代碼重用。而多態則是為了實現另一個目的--接口重用。實際工作中,重用接口比重用代碼使用得更為普遍。

面試例題5

簡單說下Java的反射機制,能舉例說下其應用嗎?

解析:Java反射說的是在運行狀態中,對於任何一個類,我們都能夠知道這個類有哪些方法和屬性。對於任何一個對象,我們都能夠對它的方法和屬性進行調用。我們把這種動態獲取對象信息和調用對象方法的功能稱之為反射機制。反射被廣泛地用於那些需要在運行時檢測或修改程序行為的程序中。儘管反射非常強大,但也不能濫用。如果一個功能可以不用反射完成,那麼最好就不用。在我們使用反射技術時,下面幾條內容應該牢記於心:


1.性能第一

反射包括了一些動態類型,所以JVM無法對這些代碼進行優化。因此,反射操作的效率要比那些非反射操作低得多。我們應該避免在經常被執行的代碼或對性能要求很高的程序中使用反射。

2.安全限制

使用反射技術要求程序必須在一個沒有安全限制的環境中運行。如果一個程序必須在有安全限制的環境中運行,如Applet,那麼這就是個問題了。

3.內部暴露

由於反射允許代碼執行一些在正常情況下不被允許的操作(比如訪問私有的屬性和方法),所以使用反射可能會導致意料之外的副作用--破壞了抽象性,降低了可移植性。

Java反射機制的應用場景,比如:

1.工廠模式:Factory類中用反射的話,添加了一個新的類之後,就不需要再修改工廠類Factory了。

2.數據庫JDBC中通過Class.forName(Driver)來獲得數據庫連接驅動。

3.分析類文件:能得到類中的方法等等。

4.訪問一些不能訪問的變量或屬性:破解別人代碼。

面試例題6

類的初始化過程是怎樣的?


解析:JVM初始化一個類包含如下幾個步驟。

1.假如這個類還沒有被加載和連接,則程序先加載並連接該類。

2.假如該類的直接父類還沒有被初始化,則先初始化其直接父類。

3.假如類中有初始化語句,則系統依次執行這些初始化語句。

在執行第2步時,系統對直接父類的初始化步驟也遵循此步驟1~3,如果該直接父類又有直接父類,則系統再次重複這三個步驟來先初始化這個父類......所以JVM最先初始化的總是java.lang.Object類。當程序主動使用任何一個類時,系統會保證該類以及所有父類(包括直接父類和間接父類)都會被初始化。

3.實際操作考察

如果通過了對語言特性的考察,那麼,接下來就要面對實際動手能力方面的考察了。

這個方面的知識點通常都是以一個非常具體的隨機性的題目呈現,考題範圍重點包括字符串的處理、日期函數的運用、正則表達式的運用、Java的集合。

關於字符串的處理、日期函數和正則表達式的運用,大家可前去查看本公眾號系列課程《大數據分析工程師入門1-Java基礎》相關部分,此類考題隨機且小知識點很多,系列課程講解的非常全面且均給出了示例,足以滿足大家應試要求,所以這裡將不再贅述。

接下來會帶領大家重點挖掘一下Java集合相關的考題。

面試例題7

你需要存儲元素到某種數據結構中,而且要確保元素在自然隊列中沒有重複,下面哪個接口能保證這種能力?

A. java.util.Map

B. java.util.List

C. java.util.Collection

D. java.util.Set

解析:要想正確回答這個問題,面試者需要對Java集合有一個清晰的脈絡。

Java容器類庫一共有兩種主要類型:Collection和Map。它們之間的區別在於容器內每個“槽”所存儲的元素個數不同,Collection每個槽內只能存儲一個元素,而Map類型中,每個槽內存儲key-value關聯。Java容器類都可以自動調整自己的尺寸。

<code>Collection的子類:
① --List:以特定次序存儲元素,取出來的順序可能和放入的順序不同
|--ArrayList:擅長隨機訪問元素,但在List中進行插入、刪除和移動元素較慢
|--LinkedList:插入、刪除、移動元素方便,但隨機訪問元素差
② --Set:每個值只能保存一個對象,不能包含重複的元素
|--HashSet:使用散列函數
|--TreeSet:使用紅黑樹
|--LinkedHashSet:使用鏈表結合散列函數
③ --Queue:先進先出的容器

Map的子類:
① --HashMap:使用散列函數
② --HashTable:使用散列函數
③ --TreeMap:使用紅黑樹/<code>

故答案選D。

對每個容器子類的特性上圖已做簡單說明,但如果要應對面試官的繼續追問,考察更為細節性的知識點,那麼,面試者最好要對每個子類的特性有一個更全面更深入的學習和總結,一般實際動手操作過的面試者對此類問題的認識會更為深刻。比如,以前經常會被問到的考題,請說明HashMap和HashTable的區別。不能說出個兩三點,那是很難讓面試官滿意的,因為如果你實際操作過,通常會有很深的體會和印象。

(PS:現在由於HashTable的概念基本完全淡化了,該問題應該會很少再被問到了,舉此案例是為了說明面試官會出類似題型來進行深入考察面試者動實際操作情況,面試者需要深入學習總結。)


分享到:


相關文章: