投资银行对Java进行的二十大核心面试问答
這是在金融領域(主要是大型投資銀行)共享Java核心訪談問題和答案的新系列。 在JP Morgan,Morgan Stanley,Barclays或Goldman Sachs上會問許多這些Java面試問題。 銀行主要從多線程 , 集合 ,序列化,編碼和OOPS設計原理詢問Java核心訪談問題。
我已經從我的朋友那里收集了這些問題,并希望與大家分享。 我希望這對我們雙方都有幫助。 練習一些編程面試問題也是有益的,因為在幾乎所有Java面試中,至少出現(xiàn)1或2個編碼問題。 請分享未回答的Java面試問題的答案,并讓我們知道這些Java面試問題有多好? 如果您正在認真準備Java面試并參加面試,那么我也建議您看看Markham公開的Java編程面試 。
這是一本專門針對Java的書籍,以其較早的暢銷書為原型,也涉及編程訪談。 本書不僅包含來自Java的問題,還包含來自相關技術堆棧的問題,例如JUnit,Maven,設計模式,JVM內部原理,Android和最佳實踐。 問題很好,答案也很明確,而且解釋得很好,這也使它讀起來很有趣。
20多個核心Java面試問題答案
這些Java面試問題是簡單,棘手和棘手的Java問題的組合,例如,為什么Java中不支持多重繼承是棘手的問題之一。 大多數(shù)問題是在高級和有經驗的水平上提出的,即3、4、5或6年的Java經驗,例如HashMap如何在Java中工作,這在有經驗的Java訪談中最受歡迎。
順便說一句,最近我正在查看關于本文中給出的Java面試問題的答案和評論,我發(fā)現(xiàn)其中的一些內容非常有用,可以包含在主要文章中,從而使所有人受益。 除了博客和文章之外,您還可以利用一些書籍,這些書籍是專門為清除編程訪談而寫的,而另一些書籍則著重于Java編程,因此想到的兩本書是《 破解編碼面試》和《 公開的編程面試》:下一份工作的秘密和。 這兩本書都側重于一般的編程以及許多其他相關主題,例如數(shù)據(jù)結構,算法,數(shù)據(jù)庫,SQL,網絡和行為問題,但也包含Java概念。
問題1:在多線程環(huán)境中使用HashMap有什么問題? 什么時候get()方法進入無限循環(huán)? ( 回答 )
好吧,沒有錯,這取決于您如何使用它。 例如,如果僅通過一個線程初始化HashMap,然后所有線程都僅從該線程讀取,那么就很好了。 一個示例是包含配置屬性的映射。 真正的問題開始于該線程中的至少一個線程正在更新HashMap,即添加,更改或刪除任何鍵值對。 由于put()操作可能會導致重新調整大小,并且可能進一步導致無限循環(huán),因此這就是為什么您以后應該使用Hashtable或ConcurrentHashMap的原因。
問題2.覆蓋hashCode()方法是否對性能有影響? ( 回答 )
這是一個好問題,對所有人開放,因為據(jù)我所知,較差的哈希碼功能將導致HashMap中頻繁發(fā)生沖突,最終增加了將對象添加到Hash Map中的時間。 從Java 8開始,沖突不會像以前的版本那樣影響性能,因為在閾值之后,鏈表將被二叉樹取代,這在最壞的情況下會為您帶來O(logN)性能,例如與鏈表的O(n)比較。
問題3:不可變對象的所有屬性是否都必須是最終的? ( 回答 )
不一定,如上所述,您可以通過使成員成為非最終成員而不是私有成員并且不修改它們(除非在構造函數(shù)中)來實現(xiàn)相同的功能。 不要為它們提供setter方法,如果它是一個可變對象,則不要泄漏該成員的任何引用。 請記住將參考變量定為final,僅確保不會將其重新分配為其他值,但是您仍然可以更改該參考變量所指向的對象的各個屬性。 這是關鍵點之一,面試官喜歡聽候選人的話。
問題4:String中的substring()方法如何工作? ( 回答 )
另一個很好的Java面試問題,我認為答案還不夠,但是這里是“子字符串通過從原始字符串中提取一部分來創(chuàng)建一個新對象”。 主要詢問此問題,以查看開發(fā)人員是否熟悉內存泄漏的風險,子字符串可能會造成內存泄漏。 在Java 1.7之前,子字符串保留原始字符數(shù)組的引用,這意味著即使長5個字符的子字符串也可以通過保留強引用來防止1GB字符數(shù)組被垃圾回收。
此問題已在Java 1.7中修復,在Java 1.7中不再引用原始字符數(shù)組,但是這種更改也使創(chuàng)建子字符串的時間花費更高。 之前是在O(1)的范圍內,在Java 7的最壞情況下可能是O(n)。
問題 5:您可以為單例編寫關鍵的部分代碼嗎? ( 回答 )
這個核心Java問題是上一個問題的跟進,并期望候選人使用雙重檢查鎖定來編寫Java單例。 請記住使用volatile變量使Singleton線程安全。 這是使用雙重檢查的鎖定習慣用法的線程安全的Singleton模式的關鍵部分的代碼:
public class Singleton {private static volatile Singleton _instance;/*** Double checked locking code on Singleton* @return Singelton instance*/public static Singleton getInstance() {if (_instance == null) {synchronized (Singleton.class) {if (_instance == null) {_instance = new Singleton();}}}return _instance;}}問題6:在編寫存儲過程或從Java訪問存儲過程時如何處理錯誤情況? ( 回答 )
這是Java面試中最棘手的問題之一,而且開放給所有人使用,我的朋友不知道答案,所以他不介意告訴我。 我的看法是,如果某些操作失敗,則存儲過程應該返回錯誤代碼,但是如果存儲過程本身失敗,則捕獲SQLException是唯一的選擇。
問題7:Executor.submit()和Executer.execute()方法之間有什么區(qū)別? ( 回答 )
該問題來自我的15個Java多線程問題解答。 由于具有良好的并發(fā)技能的Java開發(fā)人員的巨大需求,它日趨流行。 答案是前者返回一個Future對象,該對象可用于從工作線程中查找結果。
查看異常處理時有所不同。 如果您的任務拋出異常,并且該異常是在執(zhí)行時提交的,則該異常將進入未捕獲的異常處理程序(當您未明確提供異常處理程序時,默認的異常處理程序只會將堆棧跟蹤打印到System.err)。 如果在提交任務時提交了任何拋出的異常(是否經過檢查的異常) ,則它將成為任務返回狀態(tài)的一部分。 對于通過提交提交且以異常終止的任務, Future.get()將重新引發(fā)此異常,并包裝在ExecutionException 。
問題8:工廠模式和抽象工廠模式有什么區(qū)別? ( 回答 )
抽象工廠提供了另一層抽象。 考慮不同的工廠,每個工廠都從抽象工廠擴展而來,并負責根據(jù)工廠的類型創(chuàng)建不同的對象層次結構。 例如,由AutomobileFactory , UserFactory , RoleFactory等擴展的RoleFactory 。每個工廠都將負責創(chuàng)建該類型的對象。 這是工廠和抽象工廠模式的UML圖:
問題9:什么是單例? 使整個方法同步還是只同步關鍵部分更好? ( 回答 )
Java中的Singleton是一個類,在整個Java應用程序中只有一個實例,例如, java.lang.Runtime是Singleton類。 在Java 4之前,創(chuàng)建Singleton非常棘手,但是一旦Java 5引入Enum,它就非常容易。
問題10:您可以在Java 4和Java 5中編寫用于遍歷HashMap的代碼嗎? ( 回答 )
棘手的但他設法使用while和for循環(huán)來編寫。 實際上,有四種方法可以遍歷Java中的任何Map,一種涉及使用keySet()并遍歷key,然后使用get()方法來檢索值,這有點昂貴。 第二種方法涉及使用entrySet()并通過使用每個循環(huán)或在Iterator.hasNext()方法中對其進行迭代。 這是一種更好的方法,因為在迭代過程中鍵和值對象都可以使用,并且您無需調用get()方法來檢索值,這在出現(xiàn)巨大鏈接列表的情況下可以提高O(n)的性能。一桶。 有關詳細說明和代碼示例,請參見我的文章4在Java中迭代Map的方法 。
問題11:什么時候覆蓋hashCode()和equals()? ( 回答 )
只要有必要,尤其是如果您要基于業(yè)務邏輯而不是對象相等性進行相等性檢查,例如,兩個雇員對象具有相同的emp_id,則它們相等,盡管它們是由代碼的不同部分創(chuàng)建的兩個不同的對象。 如果要將它們用作HashMap中的鍵,則必須重寫這兩種方法。 現(xiàn)在,作為Java中的equals-hashcode合同的一部分,當您覆蓋equals時,還must覆蓋hashcode,否則您的對象將不會破壞類的不變性,例如Set,Map依靠equals()方法正常運行。 您還可以查看有關Java中的equals的文章5技巧,以了解在處理這兩種方法時可能出現(xiàn)的細微問題。
問題12: 如果不重寫hashCode()方法將是什么問題? ( 回答 )
如果不重寫equals方法,則equals和hashcode之間的協(xié)定將不起作用,根據(jù)該契約,由equals()相等的兩個對象必須具有相同的hashcode。 在這種情況下,另一個對象可能返回不同的hashCode并將被存儲在該位置,這破壞了HashMap類的不變性,因為它們不應允許重復的鍵。 當您使用put()方法添加對象時,將迭代該存儲桶位置中存在的所有Map.Entry對象,并更新先前映射的值(如果Map已經包含該鍵)。 如果未覆蓋哈希碼,則此方法將無效。
問題13:同步getInstance()方法的關鍵部分或整個getInstance()方法是否更好? ( 回答 )
答案只是關鍵部分,因為如果我們鎖定整個方法,那么每次有人調用此方法時,即使我們沒有創(chuàng)建任何對象,它都必須等待。 換句話說,僅在創(chuàng)建對象時才需要同步,同步僅發(fā)生一次。 創(chuàng)建對象后,無需進行任何同步。 實際上,就性能而言,這是非常差的編碼,因為同步方法最多可將性能降低10到20倍。 這是Singleton模式的UML圖:
順便說一下,有幾種方法可以在Java中創(chuàng)建線程安全的單例,您也可以在此問題或任何后續(xù)操作中提及這些方法。
問題14:在get()操作期間,圖片中的equals()和hashCode()方法在哪里? ( 回答 )
這個核心Java面試問題是對先前Java問題的后續(xù),應聘者應該知道,一旦您提到hashCode,人們很可能會問他們如何在HashMap中使用它們。 提供鍵對象時,首先調用其hashcode方法來計算存儲桶位置。 由于存儲桶可能包含多個條目作為鏈接列表,因此通過使用equals()方法評估每個Map.Entry對象,以查看它們是否包含實際的鍵對象。
問題15:如何避免Java陷入僵局? ( 回答 )
您可以通過打破循環(huán)等待條件來避免死鎖。 為此,您可以在代碼中進行安排以將順序強加于鎖的獲取和釋放。 如果將以一致的順序獲取鎖并以相反的順序釋放鎖,則不會出現(xiàn)一個線程持有由另一線程獲取的鎖的情況,反之亦然。 有關代碼示例和詳細說明,請參見詳細答案。
問題16:將String創(chuàng)建為new()和立即數(shù)有什么區(qū)別? ( 回答 )
當我們使用new()運算符創(chuàng)建字符串時,它是在堆中創(chuàng)建的,而不是添加到字符串池中,而使用文字創(chuàng)建的字符串是在存在于堆的PermGen區(qū)域的字符串池本身中創(chuàng)建的。
String str = new String("Test")不會將對象str放入字符串池,我們需要調用String.intern()方法,該方法用于顯式將它們放入字符串池。 只有將String對象創(chuàng)建為String文字(例如String s = "Test" ,Java才會自動將其放入String池。 順便說一句,這里有一個問題,因為我們將參數(shù)傳遞為“ Test”(這是一個字符串文字),所以它還將在字符串池上創(chuàng)建另一個對象作為“ Test”。 這是一個要點,直到Javarevisited博客的博學的讀者提出來之前,這一點才被注意到。 要了解更多關于字符串文字和String對象之間的差異,看到這個文章。
這是一個很好的圖像,很好地顯示了這種差異:
問題17:什么是不可變對象? 你可以寫一個不可變的類嗎? ( 回答 )
不可變類是Java類,其對象一旦創(chuàng)建就無法修改。 不可變對象中的任何修改都會產生新對象。 例如, String在Java中是不可變的 。 大多數(shù)情況下,不可變類在Java中也是最終的,以防止子類覆蓋會損害不可變性的方法。 您可以通過將成員設置為非最終成員但私有并將其修改(除非在構造函數(shù)中),來實現(xiàn)相同的功能。
除了顯而易見的形式外,您還需要確保不公開Immutable對象的內部,尤其是當它包含可變成員時。 同樣,當您從客戶端(例如java.util.Date )接受可變成員的值時,請使用clone()方法為您自己保留一個單獨的副本,以防止惡意客戶端在設置可變引用后對其進行修改的風險。
返回可變成員的值,將另一個單獨的副本返回給客戶端,從不返回Immutable類持有的原始引用時,需要采取相同的預防措施。 您可以查看我的文章如何在Java中創(chuàng)建不可變類,以獲取逐步指南和代碼示例。
問題18:提供一種最簡單的方法來找出方法執(zhí)行所需的時間而無需使用任何分析工具? ( 回答 )
在調用方法之前和thr方法返回之后立即讀取系統(tǒng)時間。 采取時間差,這將為您提供執(zhí)行方法所花費的時間。
放入代碼中...
long start = System.currentTimeMillis (); method (); long end = System.currentTimeMillis ();System.out.println (“Time taken for execution is ” + (end – start));請記住,如果執(zhí)行時間太短,則可能表明執(zhí)行時間為零毫秒。 嘗試使用一種足夠大的方法,從某種意義上說,它正在執(zhí)行大量處理
問題19:要在HashMap中使用對象作為鍵,需要實現(xiàn)以下兩種方法? ( 回答 )
為了將任何對象用作HashMap或Hashtable中的Key,它必須在Java中實現(xiàn)equals和hash-code方法。 閱讀HashMap如何在Java中工作,以獲取有關如何使用等號和哈希碼方法從HashMap放置和獲取對象的詳細說明。
問題20:如何防止客戶直接實例化您的具體類? 例如,您有一個Cache接口以及兩個實現(xiàn)類MemoryCache和DiskCache,如何確??蛻舳藳]有使用new()關鍵字創(chuàng)建這兩個類的對象。
我將這個問題留給您練習和思考,然后再給出答案。 我相信您可以找到正確的方法來執(zhí)行此操作,因為從維護的角度來看,這是保持對類的控制的重要決定之一。
我也非常感謝我的讀者,他們慷慨地為初學者和經驗豐富的開發(fā)人員提供了Java Interviews中的幾個好問題。 我已經在此博客中回答了許多這些問題,您可以使用此頁面右上角的搜索框輕松找到相關的帖子。
更多問題
- 過去5年中的133+個Java面試問題( 在此處閱讀 )
- 最近三年來的50多個Java多線程問題( 請參閱此處 )
- 50多個程序員電話面試問題及答案( 鏈接 )
推薦書籍
- Java編程面試公開
- 破解編碼面試:150個編程問題
翻譯自: https://www.javacodegeeks.com/2015/11/top-20-core-java-interview-questions-and-answers-from-investment-banks.html
總結
以上是生活随笔為你收集整理的投资银行对Java进行的二十大核心面试问答的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 使用djcproxy创建代理对象
- 下一篇: 宏?电脑开了闪下就关(Excel点击启用
