常見的Java面試問題

小咖啡111發表於2019-05-16

JVM

Java虛擬機器(JVM)是執行 Java 位元組碼的虛擬機器。JVM有針對不同系統的特定實現(Windows,Linux,macOS),目的是使用相同的位元組碼,它們都會給出相同的結果。

什麼是位元組碼?採用位元組碼的好處是什麼?

在 Java 中,JVM可以理解的程式碼就叫做 位元組碼 (即副檔名為  .class  的檔案),它不面向任何特定的處理器,只面向虛擬機器。Java 語言透過位元組碼的方式,在一定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特點。所以 Java 程式執行時比較高效,而且,由於位元組碼並不針對一種特定的機器,因此,Java程式無須重新編譯便可在多種不同作業系統的計算機上執行。

Java 程式從原始碼到執行一般有下面3步:

常見的Java面試問題

我們需要格外注意的是 .class->機器碼 這一步。在這一步 JVM 類載入器首先載入位元組碼檔案,然後透過直譯器逐行解釋執行,這種方式的執行速度會相對比較慢。而且,有些方法和程式碼塊是經常需要被呼叫的(也就是所謂的熱點程式碼),所以後面引進了 JIT 編譯器,而JIT 屬於執行時編譯。當 JIT 編譯器完成第一次編譯後,其會將位元組碼對應的機器碼儲存下來,下次可以直接使用。而我們知道,機器碼的執行效率肯定是高於 Java 直譯器的。這也解釋了我們為什麼經常會說 Java 是編譯與解釋共存的語言。

HotSpot採用了惰性評估(Lazy Evaluation)的做法,根據二八定律,消耗大部分系統資源的只有那一小部分的程式碼(熱點程式碼),而這也就是JIT所需要編譯的部分。JVM會根據程式碼每次被執行的情況收集資訊並相應地做出一些最佳化,因此執行的次數越多,它的速度就越快。JDK 9引入了一種新的編譯模式AOT(Ahead of Time Compilation),它是直接將位元組碼編譯成機器碼,這樣就避免了JIT預熱等各方面的開銷。JDK支援分層編譯和AOT協作使用。但是 ,AOT 編譯器的編譯質量是肯定比不上 JIT 編譯器的。

總結:Java虛擬機器(JVM)是執行 Java 位元組碼的虛擬機器。JVM有針對不同系統的特定實現(Windows,Linux,macOS),目的是使用相同的位元組碼,它們都會給出相同的結果。位元組碼和不同系統的 JVM 實現是 Java 語言“一次編譯,隨處可以執行”的關鍵所在。

JDK 和 JRE

JDK是Java Development Kit,它是功能齊全的Java SDK。它擁有JRE所擁有的一切,還有編譯器(javac)和工具(如javadoc和jdb)。它能夠建立和編譯程式。

JRE 是 Java執行時環境。它是執行已編譯 Java 程式所需的所有內容的集合,包括 Java虛擬機器(JVM),Java類庫,java命令和其他的一些基礎構件。但是,它不能用於建立新程式。

如果你只是為了執行一下 Java 程式的話,那麼你只需要安裝 JRE 就可以了。如果你需要進行一些 Java 程式設計方面的工作,那麼你就需要安裝JDK了。但是,這不是絕對的。有時,即使您不打算在計算機上進行任何Java開發,仍然需要安裝JDK。例如,如果要使用JSP部署Web應用程式,那麼從技術上講,您只是在應用程式伺服器中執行Java程式。那你為什麼需要JDK呢?因為應用程式伺服器會將 JSP 轉換為 Java servlet,並且需要使用 JDK 來編譯 servlet。

Java和C++的區別?

我知道很多人沒學過 C++,但是面試官就是沒事喜歡拿我們們 Java 和 C++ 比呀!沒辦法!!!就算沒學過C++,也要記下來!

都是物件導向的語言,都支援封裝、繼承和多型; Java 不提供指標來直接訪問記憶體,程式記憶體更加安全; Java 的類是單繼承的,C++ 支援多重繼承;雖然 Java 的類不可以多繼承,但是介面可以多繼承; Java 有自動記憶體管理機制,不需要程式設計師手動釋放無用記憶體。

過載和重寫的區別?構造器 Constructor 是否可被 override?

過載:  發生在同一個類中,方法名必須相同,引數型別不同、個數不同、順序不同,方法返回值和訪問修飾符可以不同,發生在編譯時。   重寫:  發生在父子類中,方法名、引數列表必須相同,返回值範圍小於等於父類,丟擲的異常範圍小於等於父類,訪問修飾符範圍大於等於父類;如果父類方法訪問修飾符為 private 則子類就不能重寫該方法。

在講繼承的時候我們就知道父類的私有屬性和構造方法並不能被繼承,所以 Constructor 也就不能被 override(重寫),但是可以 overload(過載),所以你可以看到一個類中有多個建構函式的情況。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31560357/viewspace-2644668/,如需轉載,請註明出處,否則將追究法律責任。

相關文章