常見的Java面試問題
JVM
Java虛擬機器(JVM)是執行 Java 位元組碼的虛擬機器。JVM有針對不同系統的特定實現(Windows,Linux,macOS),目的是使用相同的位元組碼,它們都會給出相同的結果。
什麼是位元組碼?採用位元組碼的好處是什麼?
在 Java 中,JVM可以理解的程式碼就叫做
位元組碼
(即副檔名為.class
的檔案),它不面向任何特定的處理器,只面向虛擬機器。Java 語言透過位元組碼的方式,在一定程度上解決了傳統解釋型語言執行效率低的問題,同時又保留了解釋型語言可移植的特點。所以 Java 程式執行時比較高效,而且,由於位元組碼並不針對一種特定的機器,因此,Java程式無須重新編譯便可在多種不同作業系統的計算機上執行。
Java 程式從原始碼到執行一般有下面3步:
我們需要格外注意的是 .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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java常見的面試題Java面試題
- 【Java面試】Java常見IO面試題!Java面試題
- 【面試】面試常見問題整理面試
- 【Java面試】JSP常見面試題!JavaJS面試題
- 【Java面試】Servlet常見面試題!JavaServlet面試題
- 【Java面試】 Javascript常見面試題!JavaScript面試題
- 常見面試SQL問題面試SQL
- Spring 常見面試問題Spring面試
- Python面試常見問題Python面試
- Redis面試常見問題Redis面試
- Java程式設計師面試常見問題Java程式設計師面試
- 求職面試常見問題:Python常見面試題全解析附答案求職Python面試題
- 好程式設計師分享:Java面試題常見問題程式設計師Java面試題
- 四個常見的Linux面試問題Linux面試
- 面試常見的非技術問題面試
- 【搞定 Java 併發面試】面試最常問的 Java 併發基礎常見面試題總結!Java面試題
- 軟體測試面試常見問題面試
- 2019年.net常見面試問題面試
- Flask專案常見面試問題Flask面試
- 大廠常見Java面試題:HibernateJava面試題
- 面試題-測試工程師常見的基礎問題面試題工程師
- 【Java】幾道常見的秋招面試題Java面試題
- 32道常見的Java基礎面試題Java面試題
- 超詳細的Java面試題總結(三)之Java集合篇常見問題Java面試題
- 前端面試之webpack面試常見問題前端面試Web
- BTA 常問的 Java基礎40道常見面試題及詳細答案Java面試題
- 【面試必備】常見Java面試題大綜合Java面試題
- 集合常見的面試題面試題
- 常見的JVM 面試題JVM面試題
- Vue常見的面試題Vue面試題
- java 常見問題Java
- 漫畫 | Redis常見面試問題(一)Redis面試
- Java常見面試題及答案彙總Java面試題
- 10個常見的Redis面試"刁難"問題Redis面試
- String常見面試題面試題
- Docker常見面試題Docker面試題
- vue 常見面試題Vue面試題
- Mysql 常見面試題MySql面試題