你好!CodeGym 匯集了各種各樣的人。我們中的一些人只想成為 Java 開發人員,並且我們正在投入大量時間和精力進行開發。其他人已經是 Java 開發人員。無論哪種情況,您都需要準備好在技術面試中接受測試。這些都不容易。他們需要情感和技術上的準備。
我最近遇到了一些針對 Java 開發人員職位的大量面試問題列表。問題分為不同的級別:初級、中級和高級。不要驚慌:並非所有問題都很簡單,但很少有人問帶星號的問題。這些問題很好,我想嘗試回答其中的大部分問題。顯然,這不可能全部放在一篇文章中。畢竟,那裡有很多問題。這意味著將有一系列文章回答這些面試問題。讓我立即強調幾點:答案會很短,因為寫得非常詳細的答案可能會被拉到單獨的一篇文章中。此外,在面試中不需要非常詳細和冗長的答案,因為你的面試官只有一個小時的時間來採訪你的基本主題(而且,
不太可讀,是嗎?好消息是這條指令並不適合我們。它適用於 JVM。
在 Java 中,當人們談論堆棧跟踪時,通常指的是發生錯誤(或異常)時在控制台上顯示的堆棧跟踪。您可以從這樣的異常中獲取堆棧跟踪:
就此而言,我們將結束今天對該主題的討論。
![探索 Java 開發人員職位的工作面試中的問題和答案。 第 1 - 1 部分](https://cdn.codegym.cc/images/article/3e6ea35b-c625-46cb-b903-faee4189c6c3/800.jpeg)
初級開發人員職位的問答
一般的問題
1. 你知道哪些設計模式?告訴我們您在工作中使用的兩種設計模式。
有各種各樣的圖案。對於那些想要徹底熟悉設計模式的人,我推薦閱讀《Head First. Design Patterns》一書。它將幫助您輕鬆學習最基本的設計模式的細節。就您可以在求職面試中提及的設計模式而言,您會想到以下內容:- Builder——一個經常使用的模板,一種替代經典對象創建方法的方法;
- 策略——一種本質上代表多態性的模式。也就是說,我們只有一個接口,但程序的行為會根據傳遞給函數的特定接口實現而改變(策略模式現在在 Java 應用程序中幾乎無處不在)。
- Factory — 這種模式可以在 ApplicationContext(或 BeanFactory)中找到;
- Singleton——默認情況下所有bean都是單例;
- 代理——基本上,Spring 中的一切都以這種或那種方式使用這種模式,例如 AOP;
- 責任鏈——一種支持 Spring Security 的模式;
- 模板——在 Spring JDBC 中使用。
核心
![探索 Java 開發人員職位的工作面試中的問題和答案。 第 1 - 2 部分](https://cdn.codegym.cc/images/article/5bcea570-4245-47e8-9de8-6017bf630bbc/512.jpeg)
2、Java有哪些數據類型?
Java 具有以下原始數據類型:- byte——整數,範圍從-128到127,佔1個字節;
- short——整數,範圍從-32768到32767,佔用2個字節;
- int — 從-2147483648 到 2147483647 的整數,佔用 4 個字節;
- long——整數,範圍從 9223372036854775808 到 9223372036854775807,佔用 8 個字節;
- float — 範圍從-3.4E+38到3.4E+38的浮點數,佔用4個字節;
- double — 範圍從-1.7E+308到1.7E+308的浮點數,佔用8個字節;
- char — UTF-16 中的單個字符,佔用 2 個字節;
- boolean true/false 值,佔用 1 個字節。
3. 對象與原始數據類型有何不同?
第一個區別是佔用的內存量:基元占用的內存很少,因為它們只包含自己的值,但對象可以包含很多不同的值——包括基元和對其他對象的引用。第二個區別是:Java 是一種面向對象的語言,因此 Java 中的所有工作都是對象之間的交互。基元在這裡不太適合。事實上,這就是 Java 不是 100% 面向對象語言的原因。第三個區別是第二個區別,因為 Java 專注於對象交互,所以有許多不同的管理對象的機制。例如,構造函數、方法、異常(主要與對像一起工作)等。為了讓原語以某種方式在這個面向對象的環境中工作,Java 的創建者想出了基本類型的包裝器( Integer、Character、Double、Boolean ...)4. 按引用傳遞參數和按值傳遞參數有什麼區別?
原始字段存儲它們的值:例如,如果我們設置int i = 9;,然後i字段存儲值 9。當我們引用一個對象時,這意味著我們有一個引用該對象的字段。換句話說,我們有一個字段存儲對像在內存中的地址。
Cat cat = new Cat();
這意味著引用對象的字段也存儲值。它們的值是內存地址。即cat存放的是new Cat()對象的內存地址。當我們將參數傳遞給方法時,它的值被複製。在原語的情況下,原語的值被複製。因此,該方法適用於副本。當副本被改變時,原件不受影響。在引用類型的情況下,複製內存地址的值。因此,兩個引用變量都將存儲指向同一對象的地址。而如果我們使用這個新的引用來改變對象,那麼我們會發現它對於舊的引用也發生了改變。畢竟,它們都指向同一個對象。
5.什麼是JVM、JDK、JRE?
JVM代表Java 虛擬機,它運行由編譯器預先生成的 Java 字節碼。 JRE代表Java 運行時環境。基本上,它是一個用於運行 Java 應用程序的環境。它包括 JVM、標準庫和其他組件,用於運行用 Java 編程語言編寫的小程序和應用程序。換句話說,JRE 是運行已編譯的 Java 程序所需的一切的包,但它不包括用於開發應用程序的工具和實用程序,例如編譯器或調試器。 JDK代表Java Development Kit ,它是JRE的擴展. 也就是說,它不僅是運行 Java 應用程序的環境,也是開發它們的環境。JDK 包含 JRE 中的所有內容,以及創建 Java 應用程序(包括 Java 文檔)所需的各種附加工具——編譯器和調試器。![探索 Java 開發人員職位的工作面試中的問題和答案。 第 1 - 3 部分](https://cdn.codegym.cc/images/article/41300d86-1760-4aa1-bf1f-6d6a51ee90ac/512.jpeg)
6. 為什麼要使用JVM?
如上所述,Java 虛擬機是運行編譯器預先生成的 Java 字節碼的虛擬機。這意味著 JVM 不理解 Java 源代碼。所以,首先,我們編譯.java文件。編譯後的文件具有.class擴展,現在是 JVM 可以理解的字節碼形式。每個操作系統的 JVM 都不同。當 JVM 運行字節碼文件時,它會根據運行的操作系統調整它們。事實上,由於有不同的JVM,不同操作系統的JDK(或JRE)也不同(每個版本都需要自己的JVM)。讓我們記住在其他編程語言中開發是如何工作的。你寫一個程序,然後它的代碼被編譯成特定操作系統的機器代碼,然後你就可以運行它了。也就是說,你需要為每個平台編寫不同版本的程序。但是 Java 對代碼的雙重處理(將源代碼編譯成字節碼,然後由 JVM 處理字節碼)讓您享受跨平台解決方案的好處。我們創建一次代碼並將其編譯成字節碼。然後我們可以把它帶到任何操作系統上,本地 JVM 就可以運行它。而這恰恰是Java的傳奇一次編寫,隨處運行的特性。![探索 Java 開發人員職位的工作面試中的問題和答案。 第 1 - 4 部分](https://cdn.codegym.cc/images/article/3095363b-5160-4eba-b5d7-3af67169d4e5/512.jpeg)
7. 什麼是字節碼?
正如我上面所說,編譯器將 Java 代碼轉換為中間字節碼(我們從擴展名為 .java 的文件轉換為擴展名為 .class 的文件)。在許多方面,字節碼類似於機器碼,只是它的指令集不是針對真實處理器,而是虛擬處理器。也就是說,它可以包括為 JIT 編譯器設計的部分,該編譯器為程序運行的實際處理器優化命令執行。JIT 編譯,也稱為即時編譯,是一種通過在程序運行時將字節碼編譯成機器碼或其他格式來提高字節碼程序性能的技術。您可能已經猜到,JVM 在運行字節碼時使用 JIT 編譯器。讓我們看一些示例字節碼:![探索 Java 開發人員職位的工作面試中的問題和答案。 第 1 - 5 部分](https://cdn.codegym.cc/images/article/db6afa1b-8250-4644-9dac-7350afaf57d1/512.jpeg)
8. JavaBean 有哪些特點?
JavaBean是遵循一定規則的 Java 類。以下是編寫JavaBean的一些規則:-
該類必須包含一個帶有公共訪問修飾符的空(無參數)構造函數。這個構造函數可以創建類的對象而不會出現任何不必要的問題(這樣就沒有不必要的參數擺弄)。
-
內部字段通過get和set實例方法訪問,這應該具有標準實現。比如我們有一個name字段,那麼我們就應該有getName和setName等。這使得各種工具(框架)可以毫無困難地自動獲取和設置bean的內容。
-
該類必須覆蓋equals()、hashCode()和toString()方法。
-
該類必須是可序列化的。也就是說,它必須具有 Serializable 標記接口或實現Externalizable接口。這樣可以可靠地保存、存儲和恢復 bean 的狀態。
![探索 Java 開發人員職位的工作面試中的問題和答案。 第 1 - 6 部分](https://cdn.codegym.cc/images/article/19d71007-5229-43ad-b790-71f99af835dc/512.jpeg)
9. 什麼是 OutOfMemoryError?
OutOfMemoryError是與 Java 虛擬機 (JVM) 相關的嚴重運行時錯誤。當 JVM 無法為對象分配內存,因為沒有足夠的內存,並且垃圾收集器無法分配更多內存時,會發生此錯誤。幾種類型的OutOfMemoryError:-
OutOfMemoryError: Java heap space — 由於內存不足,無法在 Java 堆上分配對象。此錯誤可能是由內存洩漏或默認堆大小對於當前應用程序來說太小引起的。
-
OutOfMemoryError: GC Overhead limit exceeded——因為應用程序的數據勉強能裝進堆,垃圾收集器一直在運行,導致Java程序運行很慢。結果,超出了垃圾收集器的開銷限制,應用程序因該錯誤而崩潰。
-
OutOfMemoryError: Requested array size exceeds VM limit — 這表明應用程序試圖為超過堆大小的數組分配內存。同樣,這可能意味著默認分配的內存不足。
-
OutOfMemoryError: Metaspace — 堆用完了分配給元數據的空間(元數據是類和方法的指令)。
-
OutOfMemoryError:請求大小字節的原因。交換空間不足——嘗試從堆中分配內存時發生了一些錯誤,結果導致堆空間不足。
10.什麼是堆棧跟踪?我如何得到它?
堆棧跟踪是到目前為止在應用程序執行過程中調用的類和方法的列表。您可以通過執行以下操作在應用程序的特定點獲取堆棧跟踪:
StackTraceElement[] stackTraceElements =Thread.currentThread().getStackTrace();
這為我們提供了一組按後進先出 (LIFO)順序排列的 StackTraceElements。 ![探索 Java 開發人員職位的工作面試中的問題和答案。 第 1 - 7 部分](https://cdn.codegym.cc/images/article/57608381-f496-4468-ae0d-c93d9341a69d/512.jpeg)
StackTraceElement[] stackTraceElements;
try{
...
} catch (Exception e) {
stackTraceElements = e.getStackTrace();
}
如果我們想在控制台上顯示異常的堆棧跟踪:
try{
...
} catch (Exception e) {
e.printStackTrace();
}
此外,如果發生錯誤、未經檢查的異常或未經處理的已檢查異常,那麼當應用程序崩潰時,我們會自動在控制台上獲取異常的堆棧跟踪。下面是控制台上堆棧跟踪的一個小示例: ![探索 Java 開發人員職位的工作面試中的問題和答案。 第 1 - 8 部分](https://cdn.codegym.cc/images/article/d699c7f1-f068-44ac-8631-ce7844b436c3/800.jpeg)
![探索 Java 開發人員職位的工作面試中的問題和答案。 第 1 - 9 部分](https://cdn.codegym.cc/images/article/4b177193-1e74-4514-bd70-4931ef20ee18/512.jpeg)
GO TO FULL VERSION