揭露:這篇文章包含附屬連結;如果您透過本文提供的不同連結購買產品或服務,我可能會獲得補償。
_
開發者們大家好,你們正在準備 Java 開發者面試嗎?如果是,這裡列出了一些有用的 Java 面試問題,適用於具有 2 到 5 年經驗的經驗豐富的 Java 程式設計師。
作為一名經驗豐富的開發人員,您應該學習OOP 概念、Java 基礎知識、Java 集合框架、Java 5 和6 中引入的多線程和並發實用程式、調試Java 應用程序、演算法和資料結構, 一些關於設計模式、JVM 和垃圾收集的問題以及一些謎題。
其實它是你日常工作中所做的一切的組合。
如果您是對 Web 開發有所了解的 Java 開發人員,您也會被問到流行的 Java 框架,例如 Spring、Hibernate、Struts 2.0 等。
如果您擁有5 年以上的經驗,您還可以期待有關Maven、ANT 和Gradle 等構建工具、Java 最佳實踐、單元測試和JUnit 的問題以及您解決生產問題的經驗 。
我遇到的最常見的問題之一是談論您最近遇到的生產問題以及您是如何解決的。
如果您被問到同樣的問題,請向他們提供逐步的詳細信息,從分析問題到戰術修復再到戰略解決方案。
在這篇文章中,我將向擁有 2 到 5 年經驗的 Java 人員分享我的 Java 面試問題清單。由於幾年前我有過類似的經歷,所以我知道會問什麼問題,當您開始尋找職業生涯中的新挑戰時,為自己保留一個清單總是有幫助的。
我不會在這篇文章中提供這些問題的答案,因為兩個原因,問題很簡單,你們可能知道答案,第二次提供答案意味著我以後不能用這篇文章來做我自己的準備,這是更重要的.
不過,如果有人要求或我覺得人們需要它,我可以寫另一篇文章來回答所有這些問題。
順便說一句,如果您是 Java 程式語言新手或想提高 Java 技能,那麼您還可以查看 CodeGym、ZTM 和 karpado 等網站,透過建立遊戲和專案來學習 Java。
此清單包含來自不同主題的問題,例如OOP 概念、多執行緒和並發、Java 集合、Web 服務、Spring、Hibernate、資料庫和 JDBC,它沒有涵蓋您需要準備的所有主題。
稍後當我有時間時我會添加更多主題,現在,嘗試在不使用 Google 的情況下回答這些問題:)
這裡有幾個關於 OOP 設計、SOLID 原理和基本程式設計概念的問題
松耦合允許組件以最小的依賴關係相互交互,而緊密耦合則在組件之間創建強依賴關係。
內聚是指模組內元素的歸屬程度,而耦合是指模組之間的相互依賴程度。
里氏替換原則規定超類別的物件應該可以用其子類別的物件替換,而不影響程式的正確性。
例如,如果您有一個具有超類別「Shape」和子類別「Circle」和「Square」的類別層次結構,則任何適用於Shape 的方法也應適用於Circle 或Square,而不會導致錯誤。
抽象類別可以同時具有抽象方法和具體方法,而介面只能有抽象方法。另外,一個類別可以實作多個接口,但只能擴展一個抽象類別。
組合意味著強大的所有權關係,其中所包含物件的生命週期取決於容器。
聚合意味著一種較弱的關係,其中所包含的物件可以獨立於容器而存在。關聯意味著兩個類別之間沒有任何所有權或生命週期依賴性的關係。
現在,讓我們來看看來自 Collections 和 Stream 的幾個問題
清單按順序維護元素並允許重複(例如,ArrayList、LinkedList)。集合不允許重複且不保證順序(例如,HashSet、TreeSet)。 Map 儲存鍵值對,且不允許重複鍵(例如 HashMap、TreeMap)。
同步集合使用明確鎖定來實現執行緒安全,一次只允許一個執行緒修改集合。並發集合使用非阻塞演算法,專為高並發而設計,允許多個執行緒並發修改集合,而無需明確鎖定。
HashMap的get方法會計算所提供的key的雜湊碼,根據雜湊碼決定底層陣列中的索引,然後在該索引處尋找key。如果找到則傳回對應的值;否則,傳回 null。
ConcurrentHashMap允許並發存取map而不阻塞,而Hashtable使用synchronized方法實作執行緒安全,導致潛在的效能瓶頸。 ConcurrentHashMap 透過將映射分為多個段,每個段都有鎖,從而允許多個執行緒同時修改不同的段,從而實現執行緒安全性。
當需要頻繁插入和刪除操作時使用LinkedList,因為LinkedList提供了任意位置的恆定時間插入和刪除。當隨機存取和迭代頻繁時使用 ArrayList,因為 ArrayList 透過索引提供恆定時間存取。
現在,是時候看 Java 多執行緒和並發概念的問題了:
notify和notifyAll都是Java中的方法,用來喚醒在監視器上等待的執行緒(即等待取得物件的鎖定)。 notify 會喚醒一個隨機選擇的線程,而notifyAll 則會喚醒所有等待的線程。 notifyAll 是首選,因為它確保所有等待執行緒都得到通知,防止潛在的無限期等待並提高系統回應能力。
當程式的結果取決於多個執行緒的計時或交錯時,就會出現競爭條件。為了避免競爭條件,您可以使用鎖定、信號量或原子操作等同步機制來確保程式碼的關鍵部分以原子方式執行或一次僅由一個執行緒執行。
當兩個或多個執行緒陷入等待對方釋放它們需要繼續進行的資源時,就會發生死鎖。為了避免死鎖,您可以使用資源排序、避免嵌套鎖或使用逾時取得鎖等技術。此外,設計具有清晰一致的鎖定順序的程式碼有助於防止死鎖。
java.util.concurrent 提供的一些進階並發類別包括 ExecutorService、ThreadPoolExecutor、CountDownLatch、Semaphore、CyclicBarrier、BlockingQueue 和 ConcurrentHashMap。這些類別提供常見並發模式和機制(如線程池、同步原語和並發資料結構)的線程安全實作。
是的,這是程式碼:
import java.util.concurrent.ArrayBlockingQueue; class Producer implements Runnable { private final ArrayBlockingQueue<Integer> queue; private int count = 0; Producer(ArrayBlockingQueue<Integer> queue) { this.queue = queue; } public void run() { try { while (true) { queue.put(produce()); Thread.sleep(1000); // Simulate some work } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } private int produce() { System.out.println("Producing: " + count); return count++; } } class Consumer implements Runnable { private final ArrayBlockingQueue<Integer> queue; Consumer(ArrayBlockingQueue<Integer> queue) { this.queue = queue; } public void run() { try { while (true) { consume(queue.take()); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } private void consume(int item) { System.out.println("Consuming: " + item); } } public class Main { public static void main(String[] args) { ArrayBlockingQueue<Integer> queue = new ArrayBlockingQueue<>(10); Producer producer = new Producer(queue); Consumer consumer = new Consumer(queue); Thread producerThread = new Thread(producer); Thread consumerThread = new Thread(consumer); producerThread.start(); consumerThread.start(); } }
JDBC用於Java程式連接資料庫,我們來看看一些關於資料庫和JDBC的問題
為了防止 SQL 注入攻擊,請使用具有綁定參數、輸入驗證和轉義字元的參數化查詢(準備好的語句)。避免透過連接使用者輸入來建立動態 SQL 查詢。
WHERE 子句在分組和聚合過程之前過濾行,而 HAVING 子句則根據指定條件過濾分組過程之後的聚合資料。
事務是作為單一工作單元執行的一組 SQL 語句。 ACID 是 Atomicity(原子性)、Consistency(一致性)、Isolation(隔離性)和 Durability(持久性)的縮寫,這些屬性確保資料庫系統中事務的可靠性。
視窗函數對查詢結果集中與目前行相關的一組行執行計算。它們可讓您對由 OVER 子句定義的指定視窗或行子集執行聚合函數(例如 SUM、AVG、COUNT)。視窗函數對一組行進行操作,並根據該行集為每行傳回一個值。它們通常用於排名、聚合和計算運行總計等任務。
如果您需要更多關於資料庫和 SQL 的問題,請參閱Grokking the SQL Interview 書籍
現在,是時候看看流行的 Java 框架之一 Hibernate 的問題了:
在下列情況下最好使用純 SQL:
在 Java 中,排序集合依照比較器或元素的自然排序定義的特定順序維護元素,而有序集合則會依照元素插入的順序來維護元素。
Hibernate 中的二級快取將物件儲存在共享快取區域中,通常跨多個會話。當一個實體第一次被查詢時,它會從資料庫中取出並儲存在二級快取中。對同一實體的後續查詢可以從快取中滿足,而不是存取資料庫,從而提高效能。
Hibernate 中的 save() 和 persist() 方法都用於將實體儲存到資料庫。然而,save() 立即傳回產生的標識符,而 persist() 不保證立即執行 SQL INSERT 語句;它可能會在稍後的刷新時間內執行。此外,persist() 是 JPA 規範的一部分,而 save() 是 Hibernate 特有的。
現在,讓我們來看看微服務架構和 REST Web 服務的問題
SOAP 是基於協定的、結構嚴格的,而 REST 是基於具有靈活端點的無狀態通訊的架構風格。
它封裝了整個 SOAP 訊息並定義了其結構。
實作 SSL/TLS 進行加密和驗證。
HTTP 請求或回應正文中傳輸的資料。
這是一種應用程式由小型獨立服務組成的架構風格。
微服務指的是架構設計,而REST則是網頁應用程式的架構風格。
單體具有單一程式碼庫,而微服務具有多個獨立的元件;單片可能有更高的延遲。
它管理微服務架構中的分散式事務。
它是在微服務架構中動態定位服務的機制。
在任何 Java 和 Spring 開發人員面試之前,我總是閱讀 Grokking the Java Interview 和 Grokking the Spring boot Interviw
以下是這些書中的更多問題:
並且,
而且,如果您是 Java 新手,那麼您還可以查看 CodeGym、ZTM 和 karpado 等網站,透過建立遊戲和專案來學習 Java。
謝謝你們。您可以輕鬆地在網路上找到答案,但如果有足夠的興趣,我也可以更新帖子。如果您之前也問過這些問題,請告訴我。如果有人知道答案,也可以留言。
祝你 Java 面試順利。
順便說一句,如果您是 Java 程式語言新手或想提高 Java 技能,那麼您也可以查看以下最佳 Java 課程來獲得更好的效果:
以上是Java 面試題練習答案的詳細內容。更多資訊請關注PHP中文網其他相關文章!