1. 程式人生 > >吃透這套BAT大廠Java面試題,拿offer成功率再翻一番

吃透這套BAT大廠Java面試題,拿offer成功率再翻一番

一、面向物件和麵向過程的區別

面向過程

優點 : 效能比面向物件高,因為類呼叫時需要例項化,開銷比較大,比較消耗資源;比如微控制器、嵌入式開發、Linux/Unix 等一般採用面向過程開發,效能是最重要的因素。

缺點 : 沒有面向物件易維護、易複用、易擴充套件

面向物件

優點 : 易維護、易複用、易擴充套件,由於面向物件有封裝、繼承、多型性的特性,可以設計出低耦合的系統,使系統更加靈活、更加易於維護

缺點 : 效能比面向過程低

二、Java 語言有哪些特點:

簡單易學;面向物件(封裝,繼承,多型);平臺無關性( Java 虛擬機器實現平臺無關性);可靠性;安全性;支援多執行緒;支援網路程式設計並且很方便;編譯與解釋並存;

三、關於 JVM JDK 和 JRE 最詳細通俗的解答

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 的工程師朋友們加入的 Java 架構開發:705127209

本群提供免費的學習指導架構資料以及免費的解答

不懂得問題都可以在本群提出來之後還會有職業生涯規劃以及面試指導

四、Oracle JDK 和 OpenJDK 的對比

可能在看這個問題之前很多人和我一樣並沒有接觸和使用過 OpenJDK 。那麼Oracle 和 OpenJDK 之間是否存在重大差異?下面通過我通過我收集到一些資料對你解答這個被很多人忽視的問題。

對於 Java 7,沒什麼關鍵的地方。OpenJDK 專案主要基於 Sun 捐贈的 HotSpot原始碼。此外,OpenJDK 被選為 Java 7 的參考實現,由 Oracle 工程師維護。關於 JVM,JDK,JRE 和OpenJDK 之間的區別,Oracle 部落格帖子在 2012 年有一個更詳細的答案:

問:OpenJDK 儲存庫中的原始碼與用於構建 Oracle JDK 的程式碼之間有什麼區別?

答:非常接近 - 我們的 Oracle JDK 版本構建過程基於 OpenJDK 7 構建,只添加了幾個部分,例如部署程式碼,其中包括 Oracle 的 Java 外掛和 Java WebStart的實現,以及一些封閉的原始碼派對元件,如圖形光柵化器,一些開源的第三方元件,如 Rhino,以及一些零碎的東西,如附加文件或第三方字型。展望未來,我們的目的是開源 Oracle JDK 的所有部分,除了我們考慮商業功能的部分。

總結:

1. Oracle JDK 版本將每三年釋出一次,而 OpenJDK 版本每三個月釋出一次;

2. OpenJDK 是一個參考模型並且是完全開源的,而 Oracle JDK 是OpenJDK 的一個實現,並不是完全開源的;

3. Oracle JDK 比 OpenJDK 更穩定。OpenJDK 和 Oracle JDK 的程式碼幾乎相同,但 Oracle JDK 有更多的類和一些錯誤修復。因此,如果您想開發企業/商業軟體,我建議您選擇 Oracle JDK,因為它經過了徹底的測試和穩定。某些情況下,有些人提到在使用 OpenJDK 可能會遇到了許多應用程式崩潰的問題,但是,只需切換到 Oracle JDK 就可以解決問題;

4. 頂級公司正在使用 Oracle JDK,例如 Android Studio,Minecraft 和IntelliJ IDEA 開發工具,其中 Open JDK 不太受歡迎;

5. 在響應性和 JVM 效能方面,Oracle JDK 與 OpenJDK 相比提供了更好的效能;

6. Oracle JDK 不會為即將釋出的版本提供長期支援,使用者每次都必須通過更新到最新版本獲得支援來獲取最新版本;

7. Oracle JDK 根據二進位制程式碼許可協議獲得許可,而 OpenJDK 根據 GPLv2 許可獲得許可。

歡迎工作一到五年的 Java 的工程師朋友們加入的 Java 架構開發:705127209。本群提供免費的學習指導架構資料以及免費的解答。不懂得問題都可以在本群提出來之後還會有職業生涯規劃以及面試指導

五、Java 和 C++的區別

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

 都是面向物件的語言,都支援封裝、繼承和多型

 Java 不提供指標來直接訪問記憶體,程式記憶體更加安全

 Java 的類是單繼承的,C++ 支援多重繼承;雖然 Java 的類不可以多繼承,但是介面可以多繼承。

 Java 有自動記憶體管理機制,不需要程式設計師手動釋放無用記憶體

六、什麼是 Java 程式的主類 應用程式和小程式的主類有何不同

一個程式中可以有多個類,但只能有一個類是主類。在 Java 應用程式中,這個主類是指包含 main()方法的類。而在 Java 小程式中,這個主類是一個繼承自系統類 JApplet 或 Applet 的子類。應用程式的主類不一定要求是 public類,但小程式的主類要求必須是 public 類。主類是 Java 程式執行的入口點。

七. Java 應用程式與小程式之間有那些差別

簡單說應用程式是從主執行緒啟動(也就是 main() 方法)。applet 小程式沒有main 方法,主要是嵌在瀏覽器頁面上執行(呼叫 init()執行緒或者 run()來啟動),嵌入瀏覽器這點跟 flash 的小遊戲類似。

八. 字元型常量和字串常量的區別

1. 形式上: 字元常量是單引號引起的一個字元 字串常量是雙引號引起的若干個字元

2. 含義上: 字元常量相當於一個整形值( ASCII 值),可以參加表示式運算 字串常量代表一個地址值(該字串在記憶體中存放位置)

3. 佔記憶體大小 字元常量只佔 2 個位元組 字串常量佔若干個位元組(至少一個字元結束標誌) (注意: char 在 Java 中佔兩個位元組)

九、 構造器 Constructor 是否可被 override

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