天天看點

Java面試題(一)(基礎概念與常識)

作者:程式員朱永勝

Java 語言有哪些特點

  1. 簡單易學:Java語言的文法相對簡潔,與C++相比去掉了一些複雜的特性,減少了學習和使用的難度,使得Java易于學習和上手。
  1. 面向對象:Java是一種純粹的面向對象程式設計語言,支援封裝、繼承和多态等面向對象的特性,使得代碼結構清晰,易于擴充和維護。
  1. 平台獨立性:Java語言通過Java虛拟機(JVM)實作了平台獨立性。Java源代碼編譯成位元組碼,由JVM解釋執行,可以在不同的作業系統上運作,隻需安裝相應的JVM即可。
  1. 記憶體管理:Java提供了自動的記憶體管理機制,即垃圾回收機制。程式員不需要手動管理記憶體,減少了記憶體洩漏和野指針等問題,提高了代碼的健壯性和安全性。
  1. 強大的生态系統:Java擁有豐富的類庫和架構,以及龐大的開發社群。開發者可以利用這些工具和資源快速建構應用程式,并解決各種開發需求和問題。
  1. 高性能:Java在編譯和執行上進行了優化,具有高效的執行速度。同時,通過JIT(Just-In-Time)編譯器,将熱點代碼編譯成本地機器碼,提高了運作效率。
  1. 安全性:Java提供了安全性機制,如位元組碼驗證、安全沙箱等,防止惡意代碼對系統造成損害。
  1. 多線程支援:Java内置了多線程支援,通過多線程可以實作并發程式設計,充分利用多核處理器的性能。
  1. 開發工具豐富:Java擁有衆多優秀的開發工具,如Eclipse、IntelliJ IDEA等,可以提高開發效率和代碼品質。

總體而言,Java語言具有簡單易學、面向對象、平台獨立、記憶體管理、強大的生态系統、高性能、安全性、多線程支援和豐富的開發工具等特點,使得它成為一種廣泛應用于企業級應用開發、移動應用開發和網際網路開發的程式設計語言。

JVM、JRE、JDK差別

JVM、JRE和JDK是Java開發和運作環境的不同元件,它們之間有以下差別:

  1. JVM(Java Virtual Machine):JVM是Java虛拟機的縮寫,它是Java語言的核心和關鍵元件。JVM負責解釋和執行Java位元組碼,并提供了記憶體管理、垃圾回收、線程管理等運作時環境。它使得Java程式能夠在不同的作業系統上運作,實作了平台的獨立性。
  1. JRE(Java Runtime Environment):JRE是Java運作時環境的縮寫,它是Java程式的運作環境。JRE包括JVM和Java類庫,提供了運作Java程式所需的所有元件。如果隻需要運作Java程式而不進行開發,隻需要安裝JRE即可。
  1. JDK(Java Development Kit):JDK是Java開發工具包的縮寫,它是Java程式開發的完整套件。JDK包括JRE,同時還提供了開發人員所需的編譯器(javac)、調試器(jdb)、文檔生成工具(javadoc)等開發工具。如果需要進行Java程式的開發,需要安裝JDK。

簡而言之,JVM是Java虛拟機,負責解釋和執行Java位元組碼;JRE是Java運作時環境,包括JVM和Java類庫,用于運作Java程式;JDK是Java開發工具包,包括JRE和開發工具,用于開發和編譯Java程式。

在實際使用中,如果隻需要運作Java程式,隻需安裝JRE;如果需要進行Java程式的開發,需要安裝JDK。

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

位元組碼(Bytecode)是一種中間表示形式,它是将Java源代碼編譯後生成的一種二進制格式。位元組碼是Java虛拟機(JVM)的指令集,它是一種與平台無關的中間代碼。

位元組碼由一系列指令組成,這些指令包括加載、存儲、運算、控制流等操作。Java源代碼經過編譯器編譯生成位元組碼檔案(.class檔案),然後由JVM解釋執行位元組碼指令,将其轉換為機器碼,最終在特定的作業系統和硬體上運作。

采用位元組碼的好處有以下幾點:

  1. 平台無關性:位元組碼與具體的作業系統和硬體無關,可以在任何支援Java虛拟機的平台上運作。隻要在目标平台上安裝了相應的JVM,就可以運作位元組碼,而不需要對程式進行重新編譯。
  1. 加速開發和部署:Java源代碼隻需要編譯一次生成位元組碼,然後可以在不同的環境中運作。這使得程式的開發、測試和部署更加快速和便捷。同時,位元組碼的中間表示形式也使得Java程式更容易進行優化和調試。
  1. 安全性:位元組碼是一種中間表示形式,不直接暴露源代碼。這使得Java程式的源代碼更難以被逆向工程分析,提高了程式的安全性。
  1. 可移植性:位元組碼可以在任何支援Java虛拟機的平台上運作,無需修改代碼。這種可移植性使得Java成為一個廣泛應用于跨平台開發的程式設計語言。

總的來說,位元組碼作為一種中間表示形式,具有平台無關性、加速開發和部署、安全性和可移植性等優勢。它是Java虛拟機的執行機關,使得Java程式能夠在不同的平台上運作,并為Java帶來了跨平台開發的特性。

為什麼說 Java 語言“編譯與解釋并存”

Java語言被稱為"編譯與解釋并存",是因為它的執行過程涉及到了編譯和解釋兩個階段。

首先,Java源代碼需要通過編譯器将其轉換成位元組碼(即中間代碼),這個過程稱為編譯。編譯器會對源代碼進行詞法分析、文法分析、語義分析等操作,然後生成對應的位元組碼檔案(.class檔案)。

接下來,Java虛拟機(JVM)會對位元組碼進行解釋執行,将其轉換為機器碼并運作。這個過程稱為解釋。JVM中的解釋器會逐條解釋位元組碼指令,執行相應的操作。在解釋執行的同時,JVM還會進行一些優化,如即時編譯(Just-In-Time Compilation),将熱點代碼(Hotspot Code)編譯成本地機器碼,提高執行效率。

這種編譯與解釋相結合的執行方式帶來了一些優勢:

  1. 平台無關性:通過編譯生成的位元組碼可以在任何支援Java虛拟機的平台上運作,不需要針對不同的平台重新編寫和編譯代碼。
  1. 加速開發和部署:編譯過程隻需要一次,生成的位元組碼可以在不同的環境中運作。這使得程式的開發、測試和部署更加快速和便捷。
  1. 動态性和靈活性:解釋階段可以動态地加載和執行位元組碼,使得Java程式可以進行動态代碼生成、動态類加載等操作,實作了許多動态性和靈活性的特性。

盡管Java語言是先編譯後解釋的,但在實踐中,JVM會根據具體情況進行即時編譯(JIT Compilation)和優化,将熱點代碼直接編譯成本地機器碼,以提高執行效率。這樣,Java程式可以在編譯和解釋兩個階段之間靈活切換,以最優的方式執行。

什麼是JIT?

JIT(Just-In-Time)是即時編譯的縮寫,它是一種在運作時動态将位元組碼(中間代碼)轉換為機器碼的技術。

在Java中,JIT編譯器是Java虛拟機(JVM)中的一部分,它用于對熱點代碼進行即時編譯。熱點代碼是指在程式的執行過程中頻繁被執行的部分,通常是循環、頻繁調用的方法等。JIT編譯器會監視程式的運作情況,當某個代碼片段被頻繁執行時,JIT會将該代碼片段編譯成本地機器碼,然後在後續的執行中直接執行該機器碼,進而提高程式的執行速度。

JIT編譯器的工作原理如下:

  1. 首先,JVM會将Java源代碼編譯成位元組碼,這是一個中間表示形式。
  1. 當Java程式運作時,JVM會對位元組碼進行解釋執行。在解釋執行的過程中,JIT編譯器會監視程式的執行情況,記錄哪些代碼片段被頻繁執行,即熱點代碼。
  1. 當某個代碼片段被判定為熱點代碼時,JIT編譯器會将該代碼片段進行即時編譯,将其轉換為本地機器碼。
  1. 從此以後,每當該代碼片段再次被執行時,JVM會直接執行編譯後的本地機器碼,而不再執行位元組碼。

通過JIT編譯器的即時編譯,Java程式可以在執行過程中根據實際情況優化代碼,以提高程式的執行速度。JIT編譯器的存在使得Java在性能方面能夠與其他程式設計語言相媲美。

什麼樣的代碼會被判定為熱點代碼

判定某段代碼為熱點代碼是由JIT編譯器根據程式的執行情況和性能統計資訊來決定的。具體來說,以下幾個因素可能會導緻某段代碼被判定為熱點代碼:

  1. 方法調用頻繁:如果某個方法被頻繁調用,那麼該方法的位元組碼可能會被判定為熱點代碼。JIT編譯器會嘗試将該方法的位元組碼編譯成本地機器碼,以提高方法調用的執行效率。
  1. 循環執行頻繁:如果某個循環被頻繁執行,那麼該循環的位元組碼可能會被判定為熱點代碼。JIT編譯器會嘗試将該循環的位元組碼編譯成本地機器碼,以提高循環的執行效率。
  1. 熱點探測:JVM會根據程式的執行情況和性能統計資訊來識别熱點代碼。例如,JVM可以通過計數器統計某個代碼塊的執行次數,如果執行次數超過一定門檻值,那麼該代碼塊的位元組碼可能會被判定為熱點代碼。
  1. 内聯優化:JIT編譯器會通過内聯優化來提高方法調用的執行效率。内聯是将一個方法的位元組碼直接嵌入到調用該方法的地方,避免了方法調用的開銷。如果某個方法的内聯優化能夠提高程式的性能,那麼該方法的位元組碼可能會被判定為熱點代碼。

需要注意的是,JIT編譯器的判定機制和優化政策可能因不同的JVM實作而有所差異。不同的JVM可能會采用不同的性能統計資訊和優化算法來判定熱點代碼。是以,代碼是否被判定為熱點代碼也可能因JVM版本和配置而有所不同。

Oracle JDK 與 OpenJDK的差別與聯系

Oracle JDK和OpenJDK都是Java開發工具包,用于開發和運作Java應用程式。它們之間有以下差別和聯系:

  1. 來源和許可證:Oracle JDK是由Oracle Corporation開發和提供的,而OpenJDK是由開放源代碼社群開發和提供的。Oracle JDK基于OpenJDK,Oracle在其基礎上進行了一些額外的開發和優化。Oracle JDK采用Oracle Binary Code License Agreement許可證,而OpenJDK采用GNU通用公共許可證(GPL)。
  1. 更新和支援:Oracle JDK提供了長期支援(LTS)版本和非LTS版本。LTS版本将獲得長期支援和更新,而非LTS版本則會在較短時間内停止支援。Oracle JDK還提供了商業支援和付費訂閱服務。而OpenJDK由開源社群維護和更新,社群成員提供免費的支援。
  1. 特性和更新檔:Oracle JDK在釋出之前會進行一些額外的開發和優化,包括添加新特性和修複bug。這些特性和修複在OpenJDK釋出之後可能會被合并到OpenJDK中。是以,Oracle JDK可能會包含一些OpenJDK沒有的特性和更新檔。
  1. 相容性和穩定性:Oracle JDK經過了Oracle的商業測試和驗證,可以認為是相對穩定和可靠的版本。OpenJDK在釋出之前經過了開源社群的測試,但可能在某些特定平台或環境下存在相容性問題。
  1. 釋出周期:Oracle JDK的釋出周期相對較長,一般每2-3年釋出一個LTS版本。OpenJDK則有更頻繁的釋出周期,通常每6個月釋出一個版本。

盡管有這些差別,Oracle JDK和OpenJDK在大部分情況下是相容的,因為Oracle JDK基于OpenJDK開發。大多數Java應用程式可以在兩者之間無縫切換,而不需要做任何修改。開發人員可以根據自己的需求和偏好選擇使用Oracle JDK或OpenJDK。

Java 和 C++ 的差別?

Java和C++是兩種不同的程式設計語言,它們在文法、運作環境、應用領域和設計哲學等方面存在一些差別。

  1. 文法:Java使用類和對象的概念,強調面向對象程式設計。它有垃圾回收機制,不需要手動管理記憶體。C既支援面向對象程式設計,也支援面向過程程式設計。它使用類和對象,但也可以使用指針和引用進行底層操作。C需要手動管理記憶體,包括對象的建立和銷毀。
  1. 運作環境:Java是一種解釋型語言,它的程式在Java虛拟機(JVM)上運作。這種設計使得Java程式具有跨平台的特性,可以在不同的作業系統上運作。C++是一種編譯型語言,它的程式在特定的作業系統上直接運作。
  1. 應用領域:Java廣泛用于Web開發、桌面應用、移動應用和企業級應用開發。它有豐富的類庫和架構,提供了很多開發工具和平台支援。C主要用于系統級開發、遊戲開發、嵌入式系統和性能要求較高的應用開發。C對底層硬體的通路更為直接,性能更高。
  1. 設計哲學:Java追求可移植性、安全性和可靠性。它有嚴格的類型檢查、異常處理機制和通路控制。Java程式員更多地關注代碼的邏輯結構和高層抽象。C注重靈活性和效率,允許直接操作記憶體和硬體。C程式員更多地關注性能優化和底層實作。
  1. 開發效率和學習曲線:Java相對于C來說,有更高的開發效率和更簡單的學習曲線。Java提供了自動記憶體管理、異常處理和豐富的類庫,使得開發者能夠更快速地開發應用程式。C的文法更複雜,需要對記憶體管理和底層操作有更深入的了解,是以學習和使用C++可能需要更多的時間和經驗。

需要根據具體的應用場景和需求選擇使用Java還是C++。如果需要跨平台、高可移植性和安全性,以及開發速度較快的應用,Java是一個不錯的選擇。如果需要底層控制、高性能、直接通路硬體和對記憶體管理有更大的控制權,那麼C++可能更适合。

繼續閱讀