以下是近來面試中常被問到的10個問題,現在整理分享出來,以供參考。
如果您對自己或對Java的熟練程度不太確定,那麼這是一個非常棘手的問題。如果你是Java專家,你應該放低一點。在這之後,你可能會根據你所承認的程度得到問題。因此,例如,如果您說了10,但不能回答一個相當困難的問題,那麼這將是一個缺點。
老實說,有很多不同之處。在這裡,如果你能列出最重要的,就足夠了。您應該解釋Java 8中的新特性。有關完整列表,請訪問原始網站:Java 8 JDK。
你應該知道的最重要的一點是:
Lambda表達式,一個新的語言特性,已經在這個版本中引入。 Lambda表達式可讓您將功能視為方法參數或程式碼視為資料。 Lambda表達式可讓您更緊湊地表達單方法介面的實例(稱為函數介面)。
Method references(方法參考)為已經有名稱的方法提供了易於閱讀的lambda表達式。
Default methods(預設方法)允許將新功能新增至庫的介面中,並確保與為這些介面的舊版本編寫的程式碼的二進位相容性。
Repeating annotations提供了將相同註解類型多次套用到相同宣告或型別使用的能力。
Type annotations 類型註解提供了在使用類型的任何地方應用註解的能力,而不僅僅是在聲明中。與可插入類型系統一起使用時,此特性支援改進的程式碼類型檢查。
在這裡你應該知道最重要的一點:
ArrayList
LinkedList
HashMap
HashSet
在此之後,您可能會遇到一些問題,例如什麼時候應該使用這個特定的集合類型,與其他類型相比有什麼好處,它如何存儲數據,以及幕後的數據結構是如何運作的。
在這裡,最好的方法是盡可能多地了解這些集合類型,因為各種問題幾乎是取之不盡的。
這是一個很常見的問題,用來確定你對基本知識的熟悉程度。這些是每個物件都有的方法:
Object類,屬於java.lang包,位於類別層次結構樹的頂部。每個類別都是物件類別的直接或間接的後代。您使用或編寫的每個類別都繼承物件的實例方法。您不需要使用任何這些方法,但是,如果您選擇這樣做,您可能需要使用特定於類別的程式碼覆蓋它們。
從本節討論的Object繼承的方法有:
protected Object clone() throws CloneNotSupportedException
建立並傳回此物件的副本。 public boolean equals(Object obj)
標識其他物件是否「等於」這個物件。 protected void finalize() throws Throwable
當垃圾收集決定沒有對物件的參考時,垃圾收集器會在物件上呼叫。 public final Class getClass()
傳回物件的執行時間類別。 public int hashCode()
傳回物件的hashcode#public String toString()
傳回物件的字串表示形式。 Object的notify、notifyAll和wait方法都在同步程式中獨立執行執行緒的活動中起著作用,這將在後面討論,在這裡不會討論。
有五種方法:
public final void notify()
public final void notifyAll()
public final void wait()
#public final void wait(long timeout)
public final void wait(long timeout, int nanos)
1、因為字串在Java中是不可變的,才能有String pool。透過這種方式,Java執行時間節省了大量Java堆空間,因為不同的字串變數可以引用池中的相同字串變數。如果String不是不可變的,那麼String interning就不可能實現,因為如果任何變數改變了值,它就會反映在其他變數中。
(更多相關面試題推薦:java面試題目及答案)
#2、如果字串不是不可變的,那麼它將對應用程式造成嚴重的安全威脅。例如,資料庫使用者名稱和密碼作為字串傳遞,以獲得資料庫連接、套接字編程主機和作為字串傳遞的連接埠詳細資訊。因為String是不可變的,所以它的值不能改變。否則,任何駭客都可能更改引用值,從而導致應用程式中的安全問題。
3、由於String是不可變的,所以它對於多執行緒是安全的,並且單一字串實例可以在不同的執行緒之間共享。為了線程安全,避免使用同步;字串是隱式線程安全的。
4、字串在Java類別載入器中使用,不可變性提供了正確的類別被類別載入器載入的安全性。例如,考慮一個您試圖載入java.sql的實例。連接類,但引用的值被更改為myhacking。連接類,可以對資料庫執行不需要的操作。
5、因為String是不可變的,所以它的hashcode會在建立時緩存,不需要再計算。這使它成為映射中鍵的一個很好的候選對象,而且它的處理速度比其他HashMap鍵對象快。這就是為什麼String是HashMap鍵最常用的物件。
這個問題是我最喜歡的。
final 關鍵字在幾個上下文中用來定義一個只能指派一次的實體。
Java finally區塊是用來執行重要程式碼的區塊,例如關閉連線、串流等。無論是否處理異常,Java finally區塊總是被執行。 Java finally區塊跟隨try或catch區塊。
Finalize是 GarbageCollector(垃圾收集器)在刪除/銷毀物件之前呼叫的方法,物件有資格進行垃圾收集以執行清理活動。
diamond問題反映了為什麼不允許在Java中進行多次繼承。如果有兩個類別具有具有特定方法的共用超類,那麼它將在兩個子類別中被重寫。然後,如果您決定從這兩個子類別繼承,那麼如果您想呼叫該方法,語言無法決定您想要呼叫哪個方法
我們把這個問題稱為鑽石問題。它的名字來自上面的圖片,它描述了警告。
#我認為這是一個相當困難的問題。你需要對你的類別做一些修改,以實現不變性:
1、將類別宣告為final,這樣它就不能擴展了。
2、讓所有欄位都是私有的,這樣就不允許直接存取。
3、不要為變數提供setter方法
4、讓所有可變欄位成為final,這樣它的值只能被賦值一次。
5、透過執行深度複製的建構子初始化所有欄位。
6、在getter方法中執行物件克隆,以傳回副本,而不是傳回實際的物件參考。
singleton是一個類,它只允許自己的一個實例被創建,並提供對所創建實例的存取。它包含靜態變量,這些靜態變數可以容納其自身的惟一和私有實例。當使用者希望將類別的實例化限制為一個物件時,可以使用它。當需要單一物件來協調跨系統的操作時,這通常是有幫助的。
這是您在Java EE或Spring工作時必須知道的第一個問題。控制反轉(Inversion of Control,縮寫為IoC),是物件導向程式設計中的一種設計原則,可以用來減少電腦程式碼之間的耦合度。其中最常見的方式叫做依賴注入(Dependency Injection,簡稱DI),還有一種方式叫做「依賴查找」(Dependency Lookup)。透過控制反轉,物件在被創建的時候,由一個調控系統內所有物件的外界實體,將其所依賴的物件的引用傳遞給它。也可以說,依賴被注入到物件中。
元件不做定位查詢,只提供普通的Java方法讓容器去決定依賴關係。容器全權負責的元件的組裝,它會把符合依賴關係的物件經由JavaBean屬性或建構函式傳遞給需要的物件。透過JavaBean屬性注射依賴關係的做法稱為設值方法注入(Setter Injection);將依賴關係作為建構子參數傳入的做法稱為建構器注入(Constructor Injection)
以上是頻繁遇到的10個Java面試問題的詳細內容。更多資訊請關注PHP中文網其他相關文章!