JavaRush /Java Blog /Random-TW /Java 開發者訪談問答分析。第1部分

Java 開發者訪談問答分析。第1部分

在 Random-TW 群組發布
你好!各種各樣的人聚集在 JavaRush 上。我們中的一些人只是想成為Java開發人員,投入大量的時間和精力進行開發,而其他人已經是Java開發人員了。在某種情況下,您需要為測試(技術面試)做好準備。這次考試並不容易,除了道德上的準備,還需要技術上的準備。 面試問題及答案分析。 第 1 - 1 部分我最近在 dou 上看到了一大堆Java 開發者面試問題。這些問題分為不同的等級──初級、中級和高級。不要驚慌:並非所有問題都很簡單,但有星號的問題很少被問到。問題很好,但我想嘗試回答其中的大部分問題。顯然,我不會深入探討一篇文章的範圍;畢竟,那裡有很多問題。因此,這將是一個完整的系列文章來回答這些問題。我馬上強調幾點:
  1. 有一篇很棒的文章,其中包含了他們的熱門問題和答案。有些問題與上面列出的清單(250+)重疊,因此將跳過這些問題,以免再次重複資訊。

  2. 問題是用烏克蘭語提出的,但由於大多數 JavaRush 參與者都講俄語(很大程度上我也是),所以答案將用俄語。

  3. 答案會很簡短,因為如果您寫得很詳細,某些問題的答案可能需要單獨的文章。在面試過程中,不需要如此詳細和大量的答案,因為你的面試官只有一個小時就必要的主題面試你(而且,正如你所記得的,這已經足夠了)。對於那些喜歡深入挖掘的人,我會留下連結。

那麼,讓我們開始吧。

初級問題與解答

面試問題及答案分析。 第 1 - 2 部分

一般問題

1.你知道哪些設計模式?告訴我們您在工作中使用的兩個模板。

模板種類繁多:您可以從本文和本文開始熟悉它們。好吧,對於那些想要詳細熟悉它們的人,我建議閱讀《Head First》一書。設計模式”。借助它的幫助,您可以輕鬆詳細地學習最基本的設計模式。當談到可以在面試中用作範例的設計模式時,您會想到以下一些設計模式:
  • Builder是一個常用的模板,是經典物件創建的替代方案;
  • 策略模式,本質上代表了多態性。也就是說,我們有一個接口,但程式的行為將根據該接口的具體實現轉移到功能而改變(現在該策略實際上在java應用程式中隨處使用)。
如果這對您來說還不夠,請關注Spring(如果您已經熟悉它),因為它是一個完整的框架平台,而框架又充滿了上下模式。以下是我所討論內容的幾個範例:
  • Factory - 在ApplicationContext中(或在BeanFactory中);
  • Singleton-預設所有bean都是單例;
  • 代理程式-基本上 Spring 中的所有內容都以這種或那種方式使用這種模式,例如 AOP;
  • 責任鍊是一種基於 Spring Security 運作原理的模式;
  • 模板- 在 Spring Jdbc 中使用。

Java核心

面試問題及答案分析。 第 1 - 3 部分

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 個位元組;
  • 布林true/false,佔 1 個位元組。
以及引用資料類型,它指向堆上的物件。

3. 物件與原始資料型別有何不同?

第一個差異:佔用的記憶體量:基元佔用很少,因為它們只包含自己的值,而物件可以包含非常非常多的不同值:基元和對其他物件的參考。第二個區別:Java是一種物件導向的語言,所以它裡面的一切都是透過物件之間的互動來運作的,而基元則不太適合(事實上,這就是為什麼Java不是100%物件導向的語言)。第三,接續第二點:由於Java專注於物件之間的交互,因此這些物件有許多不同的機制來管理它們。例如,建構子、方法、異常(主要對物件進行操作)等。實際上,為了讓基元能夠以某種方式參與到這個物件導向的環境中(工作),基元類型(IntegerCharacterDoubleBoolean ...)發明了包裝器。

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應用程序,還用於開發Java應用程式的環境。JDK 包含 JRE 中的所有內容,以及各種附加工具 - 用 Ja​​va 建立應用程式所需的編譯器和偵錯器(也包含 java 文件)。面試問題及答案分析。 第 1 - 4 部分

6. 為什麼要使用JVM?

如上所述,Java虛擬機器是運行編譯器預先產生的Java字節碼的虛擬機器。也就是說,JVM 不理解 Java 原始碼。因此,首先,編譯.java文件,編譯後該文件已經具有.class擴展名,並且以 JVM 理解的相同位元組代碼的形式呈現。每個作業系統都有自己的 JVM,因此在收到字節碼檔案後,JVM 會執行它,使其適應其發生的作業系統。實際上,由於 JVM 不同,不同作業系統的 JDK(或 JRE)版本也不同(每個作業系統都需要自己的 JVM)。讓我們記住其他程式語言中的開發是如何進行的。你開發一個程序,然後它的程式碼被編譯成特定作業系統的機器碼,然後你就可以執行它。換句話說,你需要為每個系統編寫不同版本的程式。而在Java中,由於雙重程式碼處理(JVM程式碼位元組的編譯和處理),您可以享受跨平台的好處。我們一旦創建了程式碼,將其重新編譯為字節碼,將其傳輸到任何作業系統,本地 JVM 就會運行該程式碼。這就是Java的傳奇屬性──一次編寫,隨處運行請閱讀「在幕後編譯和執行 Java 應用程式面試問題及答案分析。 第 1 - 5 部分」一文以了解更多相關內容。

7.什麼是字節碼?

正如我上面所說,編譯器將 Java 程式碼轉換為中間字節碼(擴展名為 .java 的檔案轉換為擴展名為 .class 的檔案)。字節碼在許多方面與機器碼相似,只是它使用的一組指令不是來自真實處理器,而是來自虛擬處理器。此外,它可能包括專注於 JIT 編譯器使用的部分,該編譯器優化了程式運行所在的真實處理器的命令執行。JIT編譯,也稱為即時編譯,是一種透過在程式運行時將字節碼編譯成機器或其他格式來提高使用字節碼的程式的效能的技術。您可能已經猜到,JVM 在執行字節碼時使用 JIT 編譯器。讓我們來看一個字節碼範例:面試問題及答案分析。 第 1 - 6 部分不太可讀,是嗎?嗯,這不是給我們的指令,而是給 JVM 的指令。這是一篇文章,可以幫助您更好地理解這個問題。

8. JavaBean有什麼特色?

JavaBeans是一個具有一定規則的Java類別。以下是寫JavaBean的一些規則:
  1. 該類別必須包含一個帶有 public 存取修飾符的空(無參數)公共存取建構函數。這個建構函數使得創建此類的物件成為可能,而不會出現不必要的問題(這樣就不會出現不必要的參數問題)。

  2. 類別的內部欄位是透過getset方法存取的,這應該是標準的。例如,如果欄位是 name,則getNamesetName等。這反過來又允許各種工具(框架)自動確定和更新 beans 的內容,而不會出現複雜情況。

  3. 類別必須包含equals()方法hashCode()toString()的重寫版本。

  4. 該類別必須是可序列化的,即它必須具有標記介面 - Serialized 或實作Externalized介面。這是必要的,以便能夠可靠地保存、儲存和恢復 bean 的狀態。

面試問題及答案分析。 第 1 - 7 部分您可以在本資料中閱讀有關 JavaBean 類型的資訊。

9. 什麼是記憶體不足錯誤?

OutOfMemoryError是與 Java 虛擬機器 (JVM) 操作相關的嚴重執行階段錯誤之一。當 JVM 由於沒有足夠的可用記憶體且垃圾收集器無法分配更多記憶體而無法分配物件時呼叫。某些類型的 OutOfMemoryError
  • OutOfMemoryError: Java 堆空間- 由於記憶體不足,無法在 Java 堆上分配物件。該錯誤可能是由記憶體洩漏或預設堆大小對於當前應用程式來說不夠大引起的。

  • OutOfMemoryError:超出GC Overhead limit - 由於堆中的資料量幾乎裝不下,垃圾收集器一直在運行,而Java程式運行速度非常慢,因此,垃圾收集器的開銷限制超出範圍並且應用程式因此錯誤而崩潰。

  • OutOfMemoryError:請求的數組大小超出 VM 限制- 指示應用程式嘗試為大於堆大小的數組分配內存,這也可能是由於默認內存分配不足所致。

  • OutOfMemoryError: Metaspace — 堆已用完為元資料分配的空間(元資料是類別和方法的指令)。

  • OutOfMemoryError:出於原因請求大小位元組。交換空間不足- 嘗試從堆分配記憶體時發生一些失敗,因此堆中記憶體不足。

10.什麼是堆疊追蹤?如何獲得?

堆疊追蹤是應用程式中到目前為止已呼叫的類別和方法的列表。您可以在應用程式中的特定點呼叫堆疊跟踪,如下所示:
StackTraceElement[] stackTraceElements =Thread.currentThread().getStackTrace();
這樣,我們將獲得按 LIFO 順序排列的堆疊追蹤元素數組- 後進先出面試問題及答案分析。 第 1 - 8 部分在 Java 中,通常,當他們談論堆疊追蹤時,他們指的是發生錯誤(或異常)時在控制台中顯示的堆疊追蹤。您可以像這樣取得異常的堆疊追蹤:
StackTraceElement[] stackTraceElements;
try{
                ...
} catch (Exception e) {
   stackTraceElements = e.getStackTrace();
}
好吧,如果我們正在討論在控制台中輸出異常堆疊追蹤:
try{
                ...
} catch (Exception e) {
  e.printStackTrace();
}
此外,如果我們遇到錯誤、未經檢查的異常或檢查的異常,我們不會處理這些異常,而只會轉發,那麼當應用程式崩潰時,我們將自動在控制台中收到異常的堆疊追蹤。控制台中堆疊追蹤異常的一個小範例:您可以在此處面試問題及答案分析。 第 1 - 9 部分閱讀有關堆疊追蹤的更多資訊。今天我們就來重點討論這個問題...面試問題及答案分析。 第 1 - 10 部分
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION